ServiceNow中通过REST导入导出Word文件时文件损坏问题求助
ServiceNow与OpenText间Word文件REST迁移问题
需求与问题概述
- 需通过REST接口将Word/.docx文件从OpenText导入ServiceNow,再导出回OpenText(无本地操作权限,仅能在ServiceNow端开发)
- 导出时直接将响应体放入multipart请求会导致文件损坏,推测是ServiceNow服务端ES5 JavaScript的字符串编码处理问题
- 限制:ServiceNow服务端JS仅支持ES5,无Node.js、File/FileReader类,仅能获取文件内容的字符串形式
- 验证:已通过PowerShell确认OpenText端无问题,问题出在ServiceNow侧,当前版本为Washington补丁8
当前导出请求代码示例
var r2 = new sn_ws.RESTMessageV2(<REST Message>, <Method>); r2.setRequestHeader('Content-Type', 'multipart/form-data;boundary=--xxx'); var boundary = '--xxx'; var body = '--' + boundary + '\r\nContent-Disposition: form-data; name="file"; filename="file.docx"\r\nContent-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document\r\n\r\n' + fileContentStr + '\r\n' + '--' + boundary + '--'; r2.setRequestBody(body); var response2 = r2.execute(); var responseBody = response2.getBody();
已尝试的编码处理方案
- 字符映射转换
var result = []; for (var i = 0; i < responseBody.length; i++) { var charCode = responseBody.charCodeAt(i); result.push(charmap[charCode] || charCode); } fileContentStr = String.fromCharCode.apply(null, result);
- ISO-8859-15编码转字节再转字符串
var fileBytes = responseBody.getBytes('ISO-8859-15'); //ISO 8859-15 var fileContentStr = ''; for (var i = 0; i < fileBytes.length; i++) { fileContentStr += String.fromCharCode(fileBytes[i]); }
- 截取字符低8位转字节再转字符串
var fileBytes = []; for (var i = 0; i < responseBody.length; i++) { fileBytes.push(responseBody.charCodeAt(i) & 0xff); } fileContentStr = String.fromCharCode.apply(null, fileBytes);
寻求解决方案
现需找到能在ServiceNow端实现该文件导入导出功能的可行方案。
内容的提问来源于stack exchange,提问作者Niklas
相关产品推荐
相关产品推荐

