SuiteScript中使用AWS SDK上传PDF至S3后无法加载文档问题
解决SuiteScript上传PDF到AWS S3后无法打开的问题
问题根源
PDF属于二进制文件,当前代码中直接调用selectedFile.getContents()获取内容,该方法返回的是UTF-8编码的字符串,会破坏二进制文件的原始字节结构,导致上传至S3后的文件损坏,无法正常打开。
解决方案
需要对二进制文件内容进行Base64编码后再上传,同时告知S3内容的编码格式,确保存储的文件保持原始结构。具体修改如下:
1. 修正文件内容获取逻辑
将文件的二进制内容转换为Base64编码,避免字符串编码导致的损坏:
// 替换原selectedFileContent的获取代码 var selectedFileContent = nEncode.convert({ string: selectedFile.getContents(), inputEncoding: nEncode.Encoding.BASE_64, outputEncoding: nEncode.Encoding.BASE_64 });
2. 调整S3上传参数
在putObject的参数中添加ContentEncoding: 'base64',让S3自动解码Base64内容并存储原始二进制:
const params ={ Bucket: awsBucketName, Key: keyFileName, Body: selectedFileContent, ContentEncoding: 'base64', // 新增此参数,告知S3内容编码格式 ServerSideEncryption: 'AES256', ACL: "public-read-write", ContentType: getContentTypeByFileExtension(fileExtension), };
3. 修正取回文件后的处理逻辑
从S3取回的内容是Base64编码的,需要解码后再创建NetSuite文件:
if (response.code === 200) { // 解码Base64内容 var decodedContent = nEncode.convert({ string: response.body, inputEncoding: nEncode.Encoding.BASE_64, outputEncoding: nEncode.Encoding.UTF_8 }); var file = nfile.create({ name: "file_name.pdf", fileType: nfile.Type.PDF, contents: decodedContent, folder: -20 }); var fileId = file.save(); nLog.debug("file save with id" + fileId) }
Upload()函数400错误说明
你使用的简化版AWS S3客户端中,Upload()方法可能需要直接接收二进制流而非字符串。如果要使用Upload(),需将文件内容转换为二进制数组后传递,但优先确保putObject的方案正常工作,这是更稳妥的二进制文件上传方式。
内容的提问来源于stack exchange,提问作者Ahmad Alissa
相关产品推荐
相关产品推荐

