You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:20:35