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

