在本地计算机上使用Word 2013中的Office 365任务窗口应用程序时,我正在尝试检索当前文档的字节数组。
为了获得字节数组,我使用了here
中的msdn示例字节数组在第一眼看上去没问题,但在将其转换回文档后,我在尝试在Word中打开文档时收到以下错误消息:
我们很抱歉。我们无法打开document.docx,因为我们发现其内容存在问题。 详细信息:文件已损坏,无法打开。
我使用Node服务器进行测试,将同一文档转换为字节数组,并比较数组中的更改,并注意到数组值之间的微小变化。 (see attached image)
有没有其他人遇到过这种问题?或者我错过了什么?
答案 0 :(得分:0)
您是否尝试将二进制文件转换为base64?我修改了onGotAllSlices方法将fileContent转换为base64(存储在mybase64变量中),然后我使用this web app将其编码回二进制(基本上保存为docx),我成功地打开了结果文件。
这里是代码(只是添加了最后一行来获取base64 :))
function onGotAllSlices(docdataSlices) {
var docdata = [];
for (var i = 0; i < docdataSlices.length; i++) {
docdata = docdata.concat(docdataSlices[i]);
}
var fileContent = new String();
for (var j = 0; j < docdata.length; j++) {
fileContent += String.fromCharCode(docdata[j]);
}
// var textFileAsBlob = new Blob(docdataSlices, { type: contentType });
var mybase64 = window.btoa(fileContent);
// Now all the file content is stored in 'fileContent' variable,
// you can do something with it, such as print, fax...
}
答案 1 :(得分:0)
感谢Juan的回答,我设法找到了解决问题的方法。
由于某些未知原因,office 365 API返回的字节数组不完整,但在将其转换为base64然后再转换为二进制文件后,就可以了。
var onGotAllSlices = function(docdataSlices, callback) {
var docdata = [];
for (var i = 0; i < docdataSlices.length; i++) {
docdata = docdata.concat(docdataSlices[i]);
}
var fileContent = new String();
for (var j = 0; j < docdata.length; j++) {
fileContent += String.fromCharCode(docdata[j]);
}
//convert to base64
var base64 = window.btoa(fileContent);
// convert it back to binary
var binaryString = window.atob(base64);
var len = binaryString.length;
var bytes = new Uint8Array(len);
for (var k = 0; k < len; k++) {
bytes[k] = binaryString.charCodeAt(k);
}
callback(bytes);
};
在回调函数中,现在我可以将字节数组上传到另一台服务器或在本地保存。