2014-09-19 184 views
2

我收到了一個很奇怪的問題,當我嘗試在第三次在我的MS Word任務窗格MVC應用程序中處理壓縮文件時,它會炸開。Office.context.document.getFileAsync拋出錯誤

下面是代碼:

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,我不知道如何解決這個問題。

請讓我知道你是否對此有任何想法。

其他細節:

enter image description here

回答

3

從MSDN:

不超過兩個文件被允許在內存中;否則操作將失敗。使用File.closeAsync方法 關閉文件,當您完成使用它時。

,請務必讓File.closeAsync再次讀取該文件之前 - 這能解釋一下你所看到的問題。

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

+0

這幾乎是我的實驗導致5001錯誤的原因 – 2015-04-16 17:59:36

-1

請參閱此鏈接 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存儲。

顯然你應該重命名該方法。

+0

這將在除片大小(具有多片),因爲'i'值是較大的文件失敗在'getSliceAsync'函數之外聲明。 – 2015-04-16 17:57:40

1

我有一個關於如何正確使用這個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

希望這可以幫助。

+0

歡迎來到Stack Overflow!雖然這可能會回答這個問題,[這將是可取的](http://meta.stackoverflow.com/q/8259)在這裏包括答案的重要部分,並提供鏈接供參考。 – 2015-01-03 03:15:52

0

附加Keyjing鵬的回答(我發現非常有幫助,謝謝!)我想我會分享在encodeBase64,你不想要,如果你是做一個變化通過REST上傳到SharePoint。在這種情況下,您想要將字節數組轉換爲Uint8Array。只有這樣我才能將它放入SharePoint庫而不會發生文件損壞。

var uArray = new Uint8Array(docdata); 

希望這可以幫助別人,到處都找不到這個信息別人在線...