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

NodeJS实现PDF先预览后下载在Chrome云端部署遇网络错误

问题:Chrome云端部署后PDF预览后下载失败

需求为先预览PDF再进行下载,而非先下载后预览,实现代码如下:

var data = fs.readFileSync('/demo.pdf');
res.contentType("application/pdf");
res.setHeader('Content-Disposition', 'inline; filename=ank.pdf');
res.send(data);

本地环境下Chrome可正常预览,点击浏览器下载图标可立即下载;但部署至云端后,可正常预览,点击下载图标时浏览器右上角下载栏提示“File wasn't available on Site”或“check internet connection”的网络错误。对比网络请求头,本地存在Connection: keep-alive,云端无此头信息。将inline改为attachment可正常下载,但不符合需求。该问题仅出现在Chrome浏览器,Firefox和Safari可正常运行。


解决建议
  • 手动添加Connection: keep-alive响应头,补充到现有代码中:
    res.setHeader('Connection', 'keep-alive');
    
  • 检查云端服务器/CDN的长连接配置,比如Nginx的keepalive_timeout参数是否设置合理,避免服务器主动断开连接;同时确认是否禁用了分块传输编码(Transfer-Encoding: chunked),Chrome对部分场景下的分块传输兼容性较差。
  • 改用流式传输替代一次性读取文件,避免大文件内存占用问题的同时,提升Chrome下载兼容性:
    const fs = require('fs');
    const stream = fs.createReadStream('/demo.pdf');
    const stats = fs.statSync('/demo.pdf');
    
    res.contentType("application/pdf");
    res.setHeader('Content-Disposition', 'inline; filename=ank.pdf');
    res.setHeader('Connection', 'keep-alive');
    res.setHeader('Content-Length', stats.size);
    
    stream.pipe(res);
    
  • 补充Content-Length响应头,让Chrome明确文件大小,避免因无法确定文件完整性导致的下载报错。
  • 添加Cache-Control头,确保Chrome认为文件可缓存且有效:
    res.setHeader('Cache-Control', 'public, max-age=3600');
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:05:59