如何用Suite Script将NetSuite中的PDF等二进制文件上传至DropBox?
解决SuiteScript上传NetSuite二进制文件到DropBox的问题
问题背景
使用SuiteScript上传NetSuite文件到DropBox时,文本、CSV文件可正常上传,但PDF、DOC、ZIP等二进制文件上传后无法正常打开(转BASE64再转UTF8上传会出现空白文件)。原代码通过getContents()获取文件内容作为请求体,无法适配二进制文件传输需求。
核心原因
NetSuite的file.getContents()方法对二进制文件会返回BASE64编码后的字符串,而DropBox上传接口要求接收原始二进制数据。直接将BASE64字符串作为请求体发送,DropBox会将其当作普通文本解析,导致文件损坏。
解决方案
放弃getContents()获取二进制文件内容,改用file.convertToByteArray()将文件转换为字节数组,直接以字节数组作为POST请求的body发送。同时优化请求头和参数处理逻辑:
// 加载NetSuite文件对象 let loadFileObj = file.load({ id: 'file Cabinet File Id' }); // 构建DropBox请求头 let apiHeaders = { "Authorization": `Bearer ${API_TOKEN}`, 'Content-Type': 'application/octet-stream', "Dropbox-API-Arg": JSON.stringify({ "path": `/Item Fulfillment/${loadFileObj.name}`, "mode": "add", "autorename": false, "mute": false }) }; // 区分文本/二进制文件处理逻辑 let fileBody; if (loadFileObj.isText) { // 文本文件仍使用getContents()获取内容 fileBody = loadFileObj.getContents(); } else { // 二进制文件转换为原始字节数组 fileBody = loadFileObj.convertToByteArray(); } // 发送上传请求 let responseData = https.post({ body: fileBody, url: API_URL, headers: apiHeaders });
关键说明
convertToByteArray()会直接返回文件的原始二进制字节数组,完全匹配DropBox接口对请求体的要求- 使用
JSON.stringify()处理DropBox-API-Arg参数,避免手动拼接JSON时的语法错误 - 通过
isText属性区分文件类型,保证文本和二进制文件都能正确上传 - 移除
Content-Transfer-Encoding请求头,该头对二进制直接传输无意义
内容的提问来源于stack exchange,提问作者HiddenOne1254
相关产品推荐
相关产品推荐

