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

为什么上传到S3的PDF文件下载打开后显示空白?

问题原因及解决方案

1. S3参数命名错误(最高频诱因)

你当前代码中写的参数是contentType,但你使用的AWS JavaScript SDK v2(upload().promise()是v2版本典型写法)要求S3的文件类型参数为首字母大写的ContentType。拼写错误会导致S3无法正确识别文件格式,错误设置响应头,甚至在传输过程中破坏二进制结构。
修复后代码:

const params = {
  Bucket: "poster-print-bucket",
  Key: Date.now().toString() + ".pdf",
  Body: blob,
  ContentType: "application/pdf", // 修正参数大小写
};

const uploaded = await S3.upload(params).promise();

2. Next.js API路由自动解析Body导致Blob损坏

Next.js API路由默认会自动解析所有请求Body,二进制格式的PDF数据会被强制转成字符串,直接损坏文件结构。你需要在pages/api/upload-poster.js路由中关闭自动解析:

// 放在api路由文件最顶部
export const config = {
  api: {
    bodyParser: false,
  },
};

关闭后请使用raw-body等工具读取原始二进制流作为S3上传的Body,不要使用解析后的req.body。

3. 前后端传输Blob时编码错误

如果前端将Blob转成了Base64、FormData字段再传给后端,后端没有完成解码就直接传给S3,也会导致生成的PDF空白。请确认后端拿到的是原始PDF二进制数据,而非编码后的字符串。

补充排查方法

  • 对比本地原PDF和S3下载的PDF大小,如果数值不一致,100%是传输环节数据被修改,优先排查上述Body解析问题
  • 可以直接在本地用同一个Blob调用S3上传(不经过Next.js API路由),如果生成的PDF正常,即可确定问题出在API路由的请求处理环节

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:45:04