2014-09-19 7 views
2

매우 이상한 문제가 발생하여 MS Word 작업 창 MVC 응용 프로그램에서 워드 문서를 압축 파일로 추출하려고하면 세 번째로 폭파됩니다 .Office.context.document.getFileAsync throwing errors

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

:

가 아니 두 개 이상의 문서가 메모리에있을 수 있습니다; 그렇지 않으면 getFileAsync 작업이 실패합니다. 파일 작업을 마치면 메서드를 사용하여 파일을 닫습니다.

파일을 다시 읽기 전에 File.closeAsync으로 전화하여 문제를 설명 할 수 있는지 확인하십시오.

에서

더보기 : (나는 매우 도움이, 감사를 발견!) 나는 당신이 당신이 경우 수행하지 않을 encodeBase64에 변화를 공유하고자합니다 https://msdn.microsoft.com/en-us/library/office/jj715284.aspx

+0

이것은 내 실험에서 5001 오류가 발생하는 원인입니다. –

-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()를 호출"을 "을 작성해야합니다 아마 같은 것을 수행해야합니다 나는 성공적으로 하늘빛의 BLOB 저장소에 저장하려면이 기술을 사용

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

합니다.

분명히 메서드의 이름을 바꾸어야합니다.

+0

이것은 슬라이스 크기 (여러 조각을 가진)은'i' 값이되고 있기 때문에보다 큰 문서에 실패합니다 ... 사람이, 다른 온라인 어디서나이 정보를 찾을 수 있습니다 'getSliceAsync' 함수 밖에서 선언되었습니다. –

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

희망.

MSDN에서
+0

스택 오버플로에 오신 것을 환영합니다! 이 질문에 대답 할 수 있지만 여기에 대답의 핵심 부분을 포함하고 참조 용 링크를 제공하는 것이 바람직합니다 (http://meta.stackoverflow.com/q/8259). –

0

추가의 Keyjing 펭에 대답 REST를 통해 SharePoint에 업로드하는 중입니다. 이 경우 바이트 배열을 Uint8Array로 변환하려고합니다. 그래야만 파일을 손상시키지 않고 SharePoint 라이브러리로 가져올 수 있습니다.

var uArray = new Uint8Array(docdata); 

희망이