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

Node.js用aws-sdk上传PDF至S3后无法查看,如何用Buffer/Uint8Array实现?

解决方案:用Buffer/Uint8Array上传可正常打开的PDF到S3

当然可以用Buffer或Uint8Array实现正常上传,你当前的问题大概率出在手动解码环节的二进制数据完整性问题,以下是修正后的实现方案:

一、优化客户端编码(避免base64转换错误)

如果客户端使用FileReader,推荐两种可靠的编码方式:

方式1:基于readAsDataURL

const reader = new FileReader();
reader.onload = (e) => {
  // 剥离data URL前缀,只保留纯base64字符串
  const base64Str = e.target.result.split(',')[1];
  // 将base64Str传给服务端
};
reader.readAsDataURL(yourPdfFile);

方式2:基于readAsArrayBuffer(更严谨的二进制转base64)

const reader = new FileReader();
reader.onload = (e) => {
  const uint8Array = new Uint8Array(e.target.result);
  // 用String.fromCharCode避免btoa直接处理二进制的编码异常
  const base64Str = btoa(String.fromCharCode(...uint8Array));
  // 将base64Str传给服务端
};
reader.readAsArrayBuffer(yourPdfFile);

二、服务端解码改用Node.js Buffer(替代手动循环)

Node.js的Buffer是Uint8Array的子类,aws-sdk完全支持将其作为Body参数,且内置的base64解码逻辑更可靠:

// 替换原有的convertBase64ToPdf函数
const convertBase64ToPdf = (base64Str) => {
  // 直接将base64字符串转为Buffer,自动处理二进制数据
  return Buffer.from(base64Str, 'base64');
};

三、上传逻辑无需修改

生成的Buffer可以直接传入上传参数的Body字段:

const doc = convertBase64ToPdf(yourReceivedBase64);
const params = {
  Bucket: BUCKET,
  Key: `${RAW_POLICIES}${s3Name}`,
  Body: doc,
  ContentType: 'application/pdf',
  Tagging: tagString,
  ContentDisposition: 'inline',
};

// 原上传代码保持不变
s3.upload(params, (err, response) => {
  if (err) {
    console.log(err);
  } else {
    console.log(`File uploaded successfully. File URL: ${response.Location}`);
  }
});

四、关于Uint8Array的直接使用

如果坚持用Uint8Array,也可以直接将其传给Body,因为Node.js的Buffer兼容Uint8Array,不过用Buffer.from转换后代码更统一,也能避免潜在的类型问题。

这样处理后,上传的PDF二进制数据会保持完整,通过签名URL访问时就能正常打开了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:12:49