我遇到一个非常奇怪的问题,当我尝试将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.我不知道如何解决这个问题。
如果您对此有任何疑问,请与我们联系。
其他详情:
答案 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存储。
显然你也应该重命名这个方法。