Office.context.document.getFileAsync выдает ошибки

Я получаю очень странную проблему, из-за которой, когда я пытаюсь извлечь текстовый документ в виде сжатого файла для обработки в моем приложении MS Word Task Pane 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. Я не знаю, как это исправить.

Пожалуйста, дайте мне знать, если у вас есть какие-либо мысли по этому поводу.

Дополнительные детали:

введите здесь описание изображения


person Benjamin Wong    schedule 19.09.2014    source источник


Ответы (4)


Из MSDN:

В памяти может находиться не более двух документов; в противном случае операция getFileAsync завершится ошибкой. Используйте метод File.closeAsync, чтобы закрыть файл, когда вы закончите работу с ним.

Убедитесь, что вы вызываете File.closeAsync перед повторным чтением файла — это может объяснить проблему, которую вы видите.

Дополнительные сведения см. по адресу: https://msdn.microsoft.com/en-us/library/office/jj715284.aspx

person Alex Sanséau    schedule 26.02.2015
comment
Это в значительной степени является причиной ошибки 5001 в моих экспериментах. - person Michael Coxon; 16.04.2015

У меня есть пример того, как правильно использовать этот 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

Надеюсь, это поможет.

person Kejing Peng    schedule 03.01.2015
comment
Добро пожаловать в Stack Overflow! Хотя это может ответить на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для ссылка. - person Nathan Tuggy; 03.01.2015
comment
@KejingPeng, как я могу получить документ Word с расширением .docx? - person Ramesh Perera; 21.05.2021

В дополнение к ответу Keyjing Peng (который я нашел очень полезным, спасибо!) Я решил поделиться вариантом encodeBase64, который вы не хотите делать, если загружаете через REST в SharePoint. В этом случае вы хотите преобразовать массив байтов в Uint8Array. Только тогда я мог получить его в библиотеке SharePoint без повреждения файла.

var uArray = new Uint8Array(docdata);

Надеюсь, это кому-то поможет, не смог найти эту информацию больше нигде в Интернете...

person foilage    schedule 18.08.2016

См. эту ссылку 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);
        }));
    }

Я использую этот метод для успешного сохранения в хранилище BLOB-объектов Azure.

Очевидно, вы также должны переименовать метод.

person John S    schedule 22.12.2014
comment
Это не удастся сделать для документов, превышающих размер фрагмента (имеющих несколько фрагментов), поскольку значение i объявляется вне функции getSliceAsync. - person Michael Coxon; 16.04.2015