NetSuite传base64二进制文件至AWS S3时文件损坏问题咨询
核心结论
S3 putObject 接口本身支持接收base64格式的请求体,但你当前的代码存在两处关键编码逻辑错误,和接口能力无关,才会导致二进制文件上传后损坏。
问题根因
- 错误配置
ContentEncoding: 'base64':这个头的作用是告知S3服务端「请求体做了base64传输编码,存储前请先解码」,但你用的AWS JS SDK在SuiteScript运行环境下不会自动对传入的字符串做对应解码处理,编码声明和实际请求处理逻辑错配,直接导致存到S3的内容字节错误。 - 错误做base64转UTF-8操作:NetSuite的
file.getContents()返回值本身就是文件内容的base64字符串,PDF这类二进制文件本身不属于UTF-8编码文本,你调用encode.convert强行把base64解码为UTF-8字符串的操作会直接丢失非文本字节,传入这个rawString必然导致文件损坏。
修复后可直接运行的代码
核心修复逻辑是把base64内容转成二进制字节数组作为请求体,删掉错误的编码头配置:
const s3 = new AWS.S3(options); // 加载文件时不要开启文本模式,避免系统自动转码损坏二进制字节 const fileObj = file.load({ id: 14676840 }); const base64Content = fileObj.getContents(); // base64转二进制字节数组,这步是解决损坏的核心 const binaryBody = Uint8Array.from(atob(base64Content), char => char.charCodeAt(0)); s3.putObject({ Bucket: BUCKET, ACL: 'authenticated-read', ContentType: 'application/pdf', Key: 'SAMPLE.pdf', Body: binaryBody }, (err, data) => { if (err) { log.error({ title: 'S3上传失败', details: JSON.stringify(err) }); return; } log.debug({ title: 'S3上传成功', details: data }); });
额外注意事项
- 加载二进制文件时不要手动设置
isText: true属性,否则NetSuite会自动对文件内容做文本编码转换,直接破坏原始二进制字节。 - 如果上传文件大小超过10MB,不要用单请求
putObject,改用S3分段上传逻辑,避免NetSuite脚本执行超时、内存溢出导致内容截断。 - 你提到Boomi流程出现完全一致的损坏问题,根因相同:没有将base64内容解码为原始二进制字节就上传,同时错误配置了编码传输头,按相同逻辑调整即可修复。
内容的提问来源于stack exchange,提问作者Nat
相关产品推荐
相关产品推荐

