如何在FileDownloadWrapper中动态修改StreamResource的文件名
解决Vaadin FileDownloadWrapper多次点击文件名不变的问题
你的问题出在StreamResource的文件名初始化时机:当前代码里的LocalDateTime.now()是在创建按钮组件时执行的,只会生成一次固定文件名,后续点击按钮不会重新计算时间戳,导致文件名始终不变。
下面提供两种可行的解决办法:
方法一:通过按钮点击事件动态更新文件名
给下载按钮添加点击监听,每次点击时重新设置StreamResource的文件名,确保每次下载都使用当前时间:
private Component createDownloadButton() { Button downloadButton = new Button(VaadinIcon.DOWNLOAD); StreamResource resource = new StreamResource("export_temp.pdf", () -> createDataForPdf()); FileDownloadWrapper buttonWrapper = new FileDownloadWrapper(resource); buttonWrapper.wrapComponent(downloadButton); downloadButton.addClickListener(e -> { // 每次点击生成新的文件名 String newFileName = String.format("export_%s.pdf", LocalDateTime.now()); resource.setFileName(newFileName); // 如果需要每次下载的内容也实时更新,可重新设置流提供者 resource.setStreamSupplier(() -> createDataForPdf()); }); return buttonWrapper; }
方法二:重写StreamResource的文件名获取逻辑
自定义StreamResource,重写getFileName()方法,让它每次被调用时都生成新的时间戳文件名:
private Component createDownloadButton() { Button downloadButton = new Button(VaadinIcon.DOWNLOAD); StreamResource resource = new StreamResource("", () -> createDataForPdf()) { @Override public String getFileName() { // 每次请求资源时自动生成当前时间的文件名 return String.format("export_%s.pdf", LocalDateTime.now()); } }; FileDownloadWrapper buttonWrapper = new FileDownloadWrapper(resource); buttonWrapper.wrapComponent(downloadButton); return buttonWrapper; }
两种方法都能实现点击按钮时下载文件名称随时间变化的需求,可根据你的实际业务场景选择使用。
内容的提问来源于stack exchange,提问作者Andromeda
相关产品推荐
相关产品推荐

