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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:43:23