【发布时间】:2020-05-21 14:16:27
【问题描述】:
我正在玩 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");
注意:fileList 列表仅用作数据库返回语句的占位符。
【问题讨论】:
-
您一次只能通过 http GET 下载一个文件。如果您想下载多个文件,您必须将它们打包(ZIP 或类似文件)