通过Vaadin Grid中的条目下载多个文件



我正在玩Vaadin,我正在尝试弄清楚如何以一致的方式下载多个文件。到目前为止,我已经创建了一个带有小类的网格,CorrespondenceFiles,它蓝图了为网格提供结构的 getter 和 setter。

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

如何迭代或递归地使用我的函数,以便在从网格引用后下载所有元素?


下载功能:

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");

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

即使可以,单击一个按钮即可下载多个文件也不是您应该做的事情。这个"规则"不是来自vaadin,而是对整个网络很重要。锚元素也不提供此类功能。使用 javascript 存在一些笨拙的解决方法,但强烈建议您这样做。

实现所需内容的最佳方法是压缩所有需要的文件,并让用户下载该单个zip文件。

最新更新