Office.context.document.getFileAsync抛出错误

时间:2014-09-19 10:26:22

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

我遇到一个非常奇怪的问题,当我尝试将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.我不知道如何解决这个问题。

如果您对此有任何疑问,请与我们联系。

其他详情:

enter image description here

4 个答案:

答案 0 :(得分:5)

来自MSDN:

  

允许内存中不超过两个文件;否则   getFileAsync操作将失败。使用File.closeAsync方法   完成工作后关闭文件。

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

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

答案 1 :(得分: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

希望这可以提供帮助。

答案 2 :(得分:0)

除了Keyjing Peng的答案之外(我觉得非常有帮助,谢谢!)我想我会在encodeBase64上分享一个变体,如果你要上传的话你不想这样做通过REST到SharePoint。在这种情况下,您希望将字节数组转换为Uint8Array。只有这样,我才能在没有文件损坏的情况下将其放入SharePoint库中。

var uArray = new Uint8Array(docdata);

希望这有助于某人,无法在任何其他地方找到此信息...

答案 3 :(得分:-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”更改为“compressed”并且需要创建方法调用doSomethingWithChunk(),并且应该执行以下操作:

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

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

显然你也应该重命名这个方法。