FileReader()无法读取大文件

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

[我正在尝试使用此应用程序脚本将文件上传到Google云端硬盘,它适用于较小的文件,但是当上传大于1 GB以上的文件时失败,

一旦加载大文件,onerror函数就会被执行。我想不通让文件读片。这是我的代码。任何帮助将不胜感激。

const chunkSize = 5242880;
$('#uploadfile').on("change", function() {
    var file = this.files[0];
    if (file.name != "") {
        var fr = new FileReader();
        fr.fileName = file.name;
        fr.fileSize = file.size;
        fr.fileType = file.type;
        fr.onload = init;
        fr.readAsArrayBuffer(file);
    }
});
function init() {
    $("#progress").text("Initializing.");
    var fileName = this.fileName;
    var fileSize = this.fileSize;
    var fileType = this.fileType;
    console.log({fileName: fileName, fileSize: fileSize, fileType: fileType});
    var buf = this.result;
    var chunkpot = getChunkpot(chunkSize, fileSize);
    var uint8Array = new Uint8Array(buf);
    var chunks = chunkpot.chunks.map(function(e) {
        return {
            data: uint8Array.slice(e.startByte, e.endByte + 1),
            length: e.numByte,
            range: "bytes " + e.startByte + "-" + e.endByte + "/" + chunkpot.total,
        };
    });
    google.script.run.withSuccessHandler(function(at) {
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable");
        xhr.setRequestHeader('Authorization', "Bearer " + at);
        xhr.setRequestHeader('Content-Type', "application/json");
        xhr.send(JSON.stringify({
            mimeType: fileType,
            name: fileName,
        }));
        xhr.onload = function() {
            doUpload({
                location: xhr.getResponseHeader("location"),
                chunks: chunks,
            });
        };
        xhr.onerror = function() {
            console.log(xhr.response);
        };
    }).getAt();
}
function doUpload(e) {
    var chunks = e.chunks;
    var location = e.location;
    var cnt = 0;
    var end = chunks.length;
    var temp = function callback(cnt) {
        var e = chunks[cnt];
        var xhr = new XMLHttpRequest();
        xhr.open("PUT", location, true);
        xhr.setRequestHeader('Content-Range', e.range);
        xhr.send(e.data);
        xhr.onloadend = function() {
            var status = xhr.status;
            cnt += 1;
            console.log("Uploading: " + status + " (" + cnt + " / " + end + ")");
            $("#progress").text("Uploading: " + Math.floor(100 * cnt / end) + "%");
            if (status == 308) {
                callback(cnt);
            } else if (status == 200) {
                $("#progress").text("Done.");
            } else {
                $("#progress").text("Error: " + xhr.response);
            }
        };
    }(cnt);
}
function getChunkpot(chunkSize, fileSize) {
    var chunkPot = {};
    chunkPot.total = fileSize;
    chunkPot.chunks = [];
    if (fileSize > chunkSize) {
        var numE = chunkSize;
        var endS = function(f, n) {
            var c = f % n;
            if (c == 0) {
                return 0;
            } else {
                return c;
            }
        }(fileSize, numE);
        var repeat = Math.floor(fileSize / numE);
        for (var i = 0; i <= repeat; i++) {
            var startAddress = i * numE;
            var c = {};
            c.startByte = startAddress;
            if (i < repeat) {
                c.endByte = startAddress + numE - 1;
                c.numByte = numE;
                chunkPot.chunks.push(c);
            } else if (i == repeat && endS > 0) {
                c.endByte = startAddress + endS - 1;
                c.numByte = endS;
                chunkPot.chunks.push(c);
            }
        }
    } else {
        var chunk = {
            startByte: 0,
            endByte: fileSize - 1,
            numByte: fileSize,
        };
        chunkPot.chunks.push(chunk);
    }
    return chunkPot;
}
jquery google-apps-script google-drive-api filereader
1个回答
0
投票

大文件失败,因为您在处理之前正在读取内存中的整个文件。

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