使用这段代码,我得到我打开的word文件base64,如果文件大小非常小,比如40到50 kb,那么它给出base64,但如果文件是1mmb或2mb,它给出错误。从office js官方文档我们可以得到base64高达4mb。但是当我得到 1mb 文件 base64 时,就会出现错误(RangeError:超出最大调用堆栈大小)。我该如何解决它,请帮忙。
function convertTobase64 () {
return new Promise(function (resolve, reject) {
Office.context.document.getFileAsync(Office.FileType.Compressed, { sliceSize: 4194304 }, function (result) {
try {
if (result.status === Office.AsyncResultStatus.Succeeded) {
var file = result.value;
file.getSliceAsync(0, function (sliceResult) {
try {
if (sliceResult.status === Office.AsyncResultStatus.Succeeded) {
var dataSlice = sliceResult.value.data;
var base64Data = btoa(String.fromCharCode.apply(null, new Uint8Array(dataSlice)));
console.log(base64Data);
resolve(base64Data);
} else {
reject(sliceResult.error);
console.log(error);
}
} catch (error) {
console.log(error);
if (error instanceof RangeError && error.message === "Maximum call stack size exceeded") {
loadToast("Opened Document size limit reached");
} else {
reject(error);
}
}
});
} else {
reject(result.error);
}
}
} catch (error) {
console.log(error);
reject(error);
}
});
});
};
function convertTobase64 () {
return new Promise(function (resolve, reject) {
Office.context.document.getFileAsync(Office.FileType.Compressed, { sliceSize: 4194304 }, function (result) {
try {
if (result.status === Office.AsyncResultStatus.Succeeded) {
var file = result.value;
var base64Data = "";
var offset = 0;
function readNextChunk() {
file.getSliceAsync(offset, function (sliceResult) {
if (sliceResult.status === Office.AsyncResultStatus.Succeeded) {
var dataSlice = sliceResult.value.data;
var reader = new FileReader();
reader.onloadend = function () {
base64Data += reader.result.split(',')[1];
offset += dataSlice.byteLength;
if (offset < file.size) {
readNextChunk();
} else {
// Close the file before resolving
file.closeAsync(function () {
resolve(base64Data);
console.log(base64Data);
fileName(base64Data);
});
}
};
reader.readAsDataURL(new Blob([new Uint8Array(dataSlice)]));
} else {
// Close the file in case of an error
file.closeAsync();
reject(sliceResult.error);
}
});
}
readNextChunk();
} else {
// Close the file in case of an error
file.closeAsync();
reject(result.error);
if (result.error.code === 5001) {
console.log("base64 Limit reached, try again to Reopen your document");
}
}
} catch (error) {
console.log(error);
reject(error);
}
});
});
}