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

如何使用pipe()实现PDF在客户端浏览器展示,避免强制下载

让PDF在浏览器内嵌展示而非强制下载的解决方案

我来帮你搞定这个问题!你当前的思路是对的,但踩了一个很常见的坑——上游API返回的响应头会覆盖你设置的头,而且你设置头的时机也有点晚,导致浏览器还是触发了下载。

问题根源

很多提供PDF文件的后端API,默认会返回 Content-Disposition: attachment 响应头,强制客户端下载文件。你虽然在代码里设置了inline,但如果上游的这个头没被移除,它会优先生效,浏览器还是会触发下载。另外,如果你在response事件里设置头的时机太晚,可能部分响应数据已经通过pipe传给客户端了,这时候修改头就不生效了。

修正后的代码

exports.print = (req, res) => {
  request("API")
    .on('response', function(response) {
      // 第一步:移除上游API自带的强制下载响应头
      delete response.headers['content-disposition'];
      
      // 第二步:设置我们需要的响应头,告诉浏览器内嵌展示PDF
      res.set({
        'Content-Disposition': 'inline; filename=my.pdf',
        'Content-Type': 'application/pdf'
      });
    })
    .pipe(res);
};

关键细节说明

  • 移除上游的Content-Disposition头:这是核心操作,确保上游的强制下载指令不会覆盖我们的设置。
  • 时机很重要:response事件是上游响应刚到达的节点,这时候还没有开始传输数据,修改响应头是完全有效的。
  • 浏览器兼容性:大部分现代浏览器(Chrome、Firefox、Edge等)都支持直接内嵌PDF,但如果是老旧的IE浏览器,可能需要用户安装PDF插件才能正常展示。

如果之后你迁移到更现代的HTTP请求库(比如got或axios),核心逻辑还是一样的:拦截响应、移除attachment类型的Content-Disposition头、替换为inline即可。

内容的提问来源于stack exchange,提问作者Pedro Guilherme

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:57:09