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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:36:27