获取base64 RangeError:Office js 加载项中超出了最大调用堆栈大小

问题描述 投票:0回答:1

使用这段代码,我得到我打开的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);
             }
         });
     });
 };

office365 office-js office-addins add-in word-addins
1个回答
0
投票

 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);
            }
        });
    });
 }

© www.soinside.com 2019 - 2024. All rights reserved.