Java 通过Vaadin网格中的条目下载多个文件

Java 通过Vaadin网格中的条目下载多个文件,java,download,vaadin,Java,Download,Vaadin,我正在和Vaadin玩游戏,我正在试图找出如何以一致的方式下载多个文件。到目前为止,我已经用一个小类创建了一个网格,recordrencefiles,它设计了为网格提供结构的getter和setter 但是,我不确定如何为多个文件创建一个下载程序,以及这个问题的最佳解决方案是什么。基本上,我所做的是使用锚定,它伪装成下载功能的按钮 如何迭代或递归地使用我的函数来获取从网格引用后下载的所有元素 下载功能: public Anchor downloadButton(String btnText,

我正在和Vaadin玩游戏,我正在试图找出如何以一致的方式下载多个文件。到目前为止,我已经用一个小类创建了一个网格,
recordrencefiles
,它设计了为网格提供结构的getter和setter

但是,我不确定如何为多个文件创建一个下载程序,以及这个问题的最佳解决方案是什么。基本上,我所做的是使用
锚定
,它伪装成下载功能的按钮

如何迭代或递归地使用我的函数来获取从网格引用后下载的所有元素


下载功能:

 public Anchor downloadButton(String btnText, String fileName) 
 {

        Button btnDownload = new Button(btnText,VaadinIcon.DOWNLOAD.create());   

        StreamResource StreamResource = new StreamResource(fileName, () -> {
            try 
            {
                return new FileInputStream(fileName);
            } 

            catch (FileNotFoundException e) 
            {
                e.printStackTrace();
                return new ByteArrayInputStream(new byte[]{});
            } 
        });
        Anchor anchorDownload = new Anchor(StreamResource, "");
        anchorDownload.getElement().setAttribute("download", true);
        anchorDownload.add(btnDownload);

        return anchorDownload;
    }


网格实例化:

List<CorrespondenceFiles> fileList = new ArrayList<>();

    fileList.add(new CorrespondenceFiles(1, mode + " - 90111", "Breakdown", "C:\\manager\\90111 - Korn, Niclas - Breakdown.pdf" ,  "90111 - Breakdown.pdf"));
    fileList.add(new CorrespondenceFiles(1, mode + " - 90111 ", "Letter of Approval", "C:\\manager\\90111 - Letter.pdf",  "90111 - Letter.pdf"));
    fileList.add(new CorrespondenceFiles(2, mode + " - 90112",  "Breakdown", "C:\\manager\\90112 - Breakdown.pdf", "90112 - 90112 - Breakdown.pdf"));

    ListDataProvider<CorrespondenceFiles> ldp = new ListDataProvider<CorrespondenceFiles>(fileList);


    grid.setDataProvider(ldp);  
    grid.addColumn(CorrespondenceFiles::getName)
        .setHeader("Name");
    grid.addColumn(CorrespondenceFiles::getDescription)
    .setHeader("Description");
    grid.addColumn(CorrespondenceFiles::getFileName)
    .setHeader("File Name");
List fileList=new ArrayList();
添加(新的对应文件(1,模式+“-90111”,“分解”,“C:\\manager\\90111-Korn,Niclas-Breakdown.pdf”,“90111-Breakdown.pdf”);
文件列表。添加(新的通信文件(1,模式+“-90111”,“批准函”,“C:\\manager\\90111-Letter.pdf”,“90111-Letter.pdf”);
添加(新的对应文件(2,模式+“-90112”,“分解”,“C:\\manager\\90112-Breakdown.pdf”,“90112-90112-Breakdown.pdf”);
ListDataProvider ldp=新的ListDataProvider(文件列表);
setDataProvider(ldp);
grid.addColumn(对应文件::getName)
.setHeader(“名称”);
grid.addColumn(对应文件::getDescription)
.setHeader(“说明”);
grid.addColumn(对应文件::getFileName)
.setHeader(“文件名”);

注意:文件列表列表仅用作数据库返回语句的占位符。

单击一个按钮即可下载多个文件不是您应该做的事情,即使您可以。这条“规则”不是来自瓦丁,而是整个网络。锚元素也不提供这种功能。存在使用javascript的黑客解决方法,但是您非常不愿意这样做


实现所需功能的最佳方法是,让用户下载单个zip文件。

单击一个按钮即可下载多个文件不是您应该做的事情,即使您可以。这条“规则”不是来自瓦丁,而是整个网络。锚元素也不提供这种功能。存在使用javascript的黑客解决方法,但是您非常不愿意这样做


实现所需功能的最佳方法是,让用户下载单个zip文件。

通过http GET一次只能下载一个文件。如果您想下载多个文件,您必须将它们打包(ZIP或类似文件),您只能通过http GET一次下载一个文件。如果你想下载多个文件,你必须打包(ZIP或类似文件)