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

Vaadin 8(Java):如何从项目路径下载文件

Vaadin 8 实现项目文件夹PDF文件下载方案

在Vaadin 8中,你可以通过FileDownloader结合StreamResource组件轻松实现PDF文件的下载,以下是两种常见场景的具体实现:

场景1:PDF位于项目类路径资源文件夹(如src/main/resources/pdf/)

如果你的PDF文件是项目打包时包含的资源文件,可通过类路径读取并触发下载:

// 创建下载按钮
Button downloadBtn = new Button("下载PDF");

// 构建流资源,读取类路径下的PDF
StreamResource pdfResource = new StreamResource(
    () -> {
        // 替换为你的PDF相对类路径,比如resources下的pdf/sample.pdf
        InputStream pdfStream = getClass().getResourceAsStream("/pdf/sample.pdf");
        if (pdfStream == null) {
            throw new RuntimeException("指定的PDF文件不存在");
        }
        return pdfStream;
    },
    "sample.pdf" // 下载时显示的文件名
);

// 明确设置MIME类型,确保浏览器正确识别
pdfResource.setMIMEType("application/pdf");

// 将下载器绑定到按钮
FileDownloader downloader = new FileDownloader(pdfResource);
downloader.extend(downloadBtn);

// 将按钮添加到UI容器
add(downloadBtn);

注意:确保你的PDF文件在构建工具(Maven/Gradle)的资源目录下,打包后能被类路径访问到。

场景2:PDF位于服务器本地文件夹(如/opt/project-files/)

如果PDF存储在服务器的本地文件系统中,直接读取本地文件即可:

Button downloadLocalBtn = new Button("下载本地PDF");
String pdfAbsolutePath = "/opt/project-files/sample.pdf"; // 替换为实际文件绝对路径
File pdfFile = new File(pdfAbsolutePath);

// 先检查文件是否存在
if (!pdfFile.exists()) {
    downloadLocalBtn.setEnabled(false);
    downloadLocalBtn.setCaption("文件不存在");
} else {
    StreamResource pdfResource = new StreamResource(
        () -> {
            try {
                return new FileInputStream(pdfFile);
            } catch (FileNotFoundException e) {
                throw new RuntimeException("读取PDF文件失败", e);
            }
        },
        pdfFile.getName()
    );
    pdfResource.setMIMEType("application/pdf");

    FileDownloader downloader = new FileDownloader(pdfResource);
    downloader.extend(downloadLocalBtn);
}

add(downloadLocalBtn);

注意:要保证运行Vaadin应用的服务器进程拥有该本地文件的读取权限,尽量使用绝对路径避免路径歧义。

内容的提问来源于stack exchange,提问作者Edoardo Bertazzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:15:38