在cordova-plugin-file(iOS)的FileReader上调用readAsArrayBuffer方法时出现内存不足错误

时间:2019-03-01 14:41:20

标签: javascript cordova cordova-plugin-file

在iOS上,我尝试将视频上传到自己的网站上,为此,我使用FileReader.readAsArrayBuffer方法,chunkSize为1048576。

当onprogress事件触发时,我上传了块,所有这些实际上都可以正常运行,除了较大的文件。尝试上传1.33GB的文件时,调用readAsArrayBuffer方法时出现内存不足异常。

我猜这是因为它试图为整个文件保留内存,但这不是必需的。有没有一种方法可以从文件中读取二进制块,而无需为整个文件保留内存?还是有其他解决方案?

谢谢!

1 个答案:

答案 0 :(得分:0)

我今天自己通过更改插件代码进行了修复,这是原始代码:

FileReader.prototype.readAsArrayBuffer = function (file) {
   if (initRead(this, file)) {
       return this._realReader.readAsArrayBuffer(file);
   }

   var totalSize = file.end - file.start;
   readSuccessCallback.bind(this)('readAsArrayBuffer', null, file.start, totalSize, function (r) {
       var resultArray = (this._progress === 0 ? new Uint8Array(totalSize) : new Uint8Array(this._result));
       resultArray.set(new Uint8Array(r), this._progress);
       this._result = resultArray.buffer;
   }.bind(this));
};

并且由于在开始时进度始终为0,因此它将始终保留整个文件大小。我添加了一个属性READ_CHUNKED(因为我仍然有其他现有的代码也使用此方法,并且希望它能够像以前一样工作,因此我必须检查其他所有内容是否仍在工作),并将以上内容更改为:

FileReader.prototype.readAsArrayBuffer = function(file) {
    if (initRead(this, file)) {
        return this._realReader.readAsArrayBuffer(file);
    }

    var totalSize = file.end - file.start;

    readSuccessCallback.bind(this)('readAsArrayBuffer', null, file.start, totalSize, function(r) {
        var resultArray;

        if (!this.READ_CHUNKED) {
            resultArray = new Uint8Array(totalSize);
            resultArray.set(new Uint8Array(r), this._progress);
        } else {
            var newSize = FileReader.READ_CHUNK_SIZE;
            if ((totalSize - this._progress) < FileReader.READ_CHUNK_SIZE) {
                newSize = (totalSize - this._progress);
            }
            resultArray = new Uint8Array(newSize);
            resultArray.set(new Uint8Array(r), 0);
        }
        this._result = resultArray.buffer;
    }.bind(this));
};

当READ_CHUNKED属性为true时,它仅返回块,并且不为整个文件保留内存;当它为false时,它将像以前一样工作。

我从没使用过github(除了拉代码),所以我暂时不上传它,我可能会在不久的将来进行研究。