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
相关产品推荐
相关产品推荐

