通过 Vaadin 网格中的条目下载多个文件
Download multiple files via entries in a Vaadin Grid
我正在研究 Vaadin,我正在尝试弄清楚如何以一致的方式下载多个文件。到目前为止,我已经创建了一个带有小 class、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 列表仅用作数据库返回语句的占位符。
单击一个按钮即可下载多个文件不是您应该做的事情,即使您可以。这个 "rule" 不是来自 vaadin,而是整个网络的计数。锚元素也不提供这样的功能。存在使用 javascript 的变通方法,但强烈建议您不要这样做。
实现所需内容的最佳方法是 ZIP all the needed files,并让用户下载该单个 zip 文件。
我正在研究 Vaadin,我正在尝试弄清楚如何以一致的方式下载多个文件。到目前为止,我已经创建了一个带有小 class、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 列表仅用作数据库返回语句的占位符。
单击一个按钮即可下载多个文件不是您应该做的事情,即使您可以。这个 "rule" 不是来自 vaadin,而是整个网络的计数。锚元素也不提供这样的功能。存在使用 javascript 的变通方法,但强烈建议您不要这样做。
实现所需内容的最佳方法是 ZIP all the needed files,并让用户下载该单个 zip 文件。