AngularJS 1.0调用Java Servlet返回PDF,如何设置下载文件为.pdf扩展名?
解决Servlet返回PDF时下载文件名后缀错误的问题
这个问题很常见,核心是你的Servlet没有明确告诉浏览器返回的内容类型和正确的下载文件名,导致浏览器默认用Servlet的名称加上.html后缀来命名文件。下面是具体的解决步骤:
一、Servlet端的关键设置(最核心)
在你的Servlet的doGet或doPost方法中,添加以下响应头设置:
1. 设置正确的Content-Type
首先告诉浏览器返回的是PDF格式的内容:
response.setContentType("application/pdf");
2. 设置Content-Disposition指定文件名
这一步是让浏览器知道该用什么文件名下载,有两种常用模式:
- 强制下载(弹出保存对话框):
// 把"invoice-2024.pdf"换成你需要的文件名,支持动态生成的文件名 response.setHeader("Content-Disposition", "attachment; filename=\"invoice-2024.pdf\""); - 在线预览+可下载:
如果希望浏览器能直接预览PDF(支持的话),同时用户也能下载,用inline模式:response.setHeader("Content-Disposition", "inline; filename=\"report.pdf\"");
3. 正确输出PDF数据
最后确保你把PDF的字节数据写入响应输出流,比如:
// 假设pdfBytes是你生成或读取到的PDF字节数组 OutputStream outputStream = response.getOutputStream(); outputStream.write(pdfBytes); outputStream.flush(); outputStream.close();
二、AngularJS 1.0端的配合(如果是通过AJAX调用)
如果你是用AngularJS的$http来调用Servlet,需要设置responseType为arraybuffer,否则可能无法正确处理二进制的PDF数据:
$http.get('/your-servlet-path', {responseType: 'arraybuffer'}) .success(function(data) { var blob = new Blob([data], {type: 'application/pdf'}); var downloadLink = document.createElement('a'); downloadLink.href = window.URL.createObjectURL(blob); // 这里的download属性可以指定文件名,但Servlet端的Content-Disposition优先级更高 downloadLink.download = "your-file.pdf"; downloadLink.click(); // 释放URL对象 window.URL.revokeObjectURL(downloadLink.href); });
只要Servlet端正确设置了那两个响应头,即使前端不设置download属性,浏览器也会自动使用Servlet指定的文件名和.pdf后缀来下载文件。
内容的提问来源于stack exchange,提问作者djfried
相关产品推荐
相关产品推荐

