【问题标题】:Office.context.document.getFileAsync throwing errorsOffice.context.document.getFileAsync 抛出错误
【发布时间】:2014-09-19 10:26:22
【问题描述】:

我遇到了一个非常奇怪的问题,当我第三次尝试将 word 文档提取为压缩文件以便在我的 MS Word 任务窗格 MVC 应用程序中进行处理时,它会爆炸。

代码如下:

Office.context.document.getFileAsync(Office.FileType.Compressed, function (result) {
if (result.status == "succeeded") {
    var file = result.value;

    file.getSliceAsync(0, function (resultSlice) {
        //DO SOMETHING
    });
} else {
    //TODO: Service fault handling?
}
});

出现的错误代码是 5001。我不知道如何解决这个问题。

如果您对此有任何想法,请告诉我。

其他细节:

【问题讨论】:

    标签: javascript ms-office apps-for-office


    【解决方案1】:

    来自 MSDN:

    内存中最多允许两个文档;否则 getFileAsync 操作将失败。使用File.closeAsync 方法 完成处理后关闭文件。

    确保在再次阅读文件之前致电File.closeAsync - 这可以解释您所看到的问题。

    更多信息:https://msdn.microsoft.com/en-us/library/office/jj715284.aspx

    【讨论】:

    • 这几乎是导致我的实验出现 5001 错误的原因
    【解决方案2】:

    我有一个关于如何正确使用此 API 的示例。实际上,MSDN 中的当前示例不是很正确。此代码在 Word 中进行了测试。

    // Usually we encode the data in base64 format before sending it to server.
    function encodeBase64(docData) {
        var s = "";
        for (var i = 0; i < docData.length; i++)
            s += String.fromCharCode(docData[i]);
        return window.btoa(s);
    }
    
    // Call getFileAsync() to start the retrieving file process.
    function getFileAsyncInternal() {
        Office.context.document.getFileAsync("compressed", { sliceSize: 10240 }, function (asyncResult) {
            if (asyncResult.status == Office.AsyncResultStatus.Failed) {
                document.getElementById("log").textContent = JSON.stringify(asyncResult);
            }
            else {
                getAllSlices(asyncResult.value);
            }
        });
    }
    
    // Get all the slices of file from the host after "getFileAsync" is done.
    function getAllSlices(file) {
        var sliceCount = file.sliceCount;
        var sliceIndex = 0;
        var docdata = [];
        var getSlice = function () {
            file.getSliceAsync(sliceIndex, function (asyncResult) {
                if (asyncResult.status == "succeeded") {
                    docdata = docdata.concat(asyncResult.value.data);
                    sliceIndex++;
                    if (sliceIndex == sliceCount) {
                        file.closeAsync();
                        onGetAllSlicesSucceeded(docdata);
                    }
                    else {
                        getSlice();
                    }
                }
                else {
                    file.closeAsync();
                    document.getElementById("log").textContent = JSON.stringify(asyncResult);
    
                }
            });
        };
        getSlice();
    }
    
    // Upload the docx file to server after obtaining all the bits from host.
    function onGetAllSlicesSucceeded(docxData) {
        $.ajax({
            type: "POST",
            url: "Handler.ashx",
            data: encodeBase64(docxData),
            contentType: "application/json; charset=utf-8",
        }).done(function (data) {
            document.getElementById("documentXmlContent").textContent = data;
        }).fail(function (jqXHR, textStatus) {
        });
    }
    

    您可以从这里找到更多信息: https://github.com/pkkj/AppForOfficeSample/tree/master/GetFileAsync

    希望这会有所帮助。

    【讨论】:

    • 欢迎来到 Stack Overflow!虽然这可能会回答问题,但it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
    • @KejingPeng 如何检索.docx扩展名的Word文档?
    【解决方案3】:

    Keyjing Peng 的答案的补充(我发现它非常有帮助,谢谢!)我想我会分享 encodeBase64 的变体,如果您通过 REST 上传到 SharePoint,您不想这样做。在这种情况下,您希望将字节数组转换为 Uint8Array。只有这样我才能将它放入 SharePoint 库而不会损坏文件。

    var uArray = new Uint8Array(docdata);
    

    希望这对某人有所帮助,在网上其他任何地方都找不到此信息...

    【讨论】:

      【解决方案4】:

      查看此链接 http://msdn.microsoft.com/en-us/library/office/jj715284(v=office.1501401).aspx

      它包含这个示例方法:

      var i = 0;
      var slices = 0;
      
      function getDocumentAsPDF() {
      
      Office.context.document.getFileAsync("pdf",{sliceSize: 2097152}, function (result) {
          if (result.status == "succeeded") {
              // If the getFileAsync call succeeded, then
              // result.value will return a valid File Object.
               myFile = result.value;
               slices = myFile.sliceCount;
               document.getElementById("result").innerText = " File size:" + myFile.size + " #Slices: " + slices;
      
               // Iterate over the file slices.
               for ( i = 0; i < slices; i++) {
                   var slice = myFile.getSliceAsync(i, function (result) {
                       if (result.status == "succeeded") {  
                           doSomethingWithChunk(result.value.data);
                           if (slices == i) // Means it's done traversing...
                           {
                               SendFileComplete();
                           }
                       }
                       else
                           document.getElementById("result").innerText = result.error.message;
                       });
               }
               myFile.closeAsync();
          }
          else
              document.getElementById("result2").innerText = result.error.message;
      });
      

      }

      将“pdf”更改为“压缩”,并且需要创建方法调用 doSomethingWithChunk(),并且可能应该执行以下操作:

      function base64Encode(str) {
              return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
                  return String.fromCharCode('0x' + p1);
              }));
          }
      

      我使用此技术成功保存到 Azure blob 存储。

      显然您也应该重命名该方法。

      【讨论】:

      • 这将在大于切片大小(具有多个切片)的文档上失败,因为 i 值是在 getSliceAsync 函数之外声明的。
      猜你喜欢
      • 2012-10-28
      • 1970-01-01
      • 2015-03-24
      • 2011-12-27
      • 2018-08-06
      • 2011-10-17
      • 2016-02-04
      • 2017-11-11
      相关资源
      最近更新 更多