【问题标题】:wrong bytearray of a document in office taskpane app using office365 javascript API使用office365 javascript API的office任务窗格应用程序中文档的错误字节数组
【发布时间】:2016-06-03 15:28:55
【问题描述】:

当在本地计算机上的 Word 2013 中使用 Office 365 任务窗格应用程序时,我正在尝试检索当前文档的字节数组。

为了获取字节数组,我使用了here的msdn示例

字节数组乍一看还不错,但在将其转换回文档后,尝试在 Word 中打开文档时收到以下错误消息:

我们很抱歉。我们无法打开 document.docx,因为我们发现其内容存在问题。 详细信息:文件已损坏,无法打开。

我使用 Node 服务器进行了测试,将相同的文档转换为字节数组,并比较数组的变化,并注意到数组值之间的微小变化。 (see attached image)

还有其他人遇到过这种问题吗?还是我错过了什么?

【问题讨论】:

    标签: office365 office365api office365-apps


    【解决方案1】:

    您是否尝试过将二进制文件转换为 base64?我修改了 onGotAllSlices 方法以将 fileContent 转换为 base64(存储在 mybase64 变量中),然后我使用this Web 应用程序将其编码回二进制(基本上将其保存为 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...
        }

    【讨论】:

    • 感谢您的回答,这个解决方案让我走上了正轨。我需要文件的字节数组来使用 API 将文件上传到另一个服务。
    【解决方案2】:

    感谢胡安的回答,我设法找到了解决问题的方法。

    由于某些未知原因,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);
    };

    在回调函数中,现在我可以将字节数组上传到另一台服务器或保存在本地。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多