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

