在 cordova-plugin-file (iOS) 的 FileReader 上调用 readAsArrayBuffer 方法时出现内存不足错误
out of memory error when calling readAsArrayBuffer method on FileReader of the cordova-plugin-file (iOS)
在 iOS 我试图将视频上传到我自己的网站,为此我使用 FileReader.readAsArrayBuffer 方法,块大小为 1048576。
我在 onprogress 事件触发时上传块,除了更大的文件外,所有这一切实际上都很完美。尝试上传 1.33GB 的文件时,调用 readAsArrayBuffer 方法时出现内存不足异常。
我猜这是因为它试图为整个文件保留内存,但这不是必需的。有没有办法在不为整个文件保留内存的情况下从文件中读取二进制块?或者还有其他解决方案吗?
谢谢!
今天改了插件代码自己修好了,这是原代码:
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 属性 为真时,它只 returns 块,不为整个文件保留内存,当它为假时,它像以前一样工作.
我从未使用过 github(除了提取代码)所以我暂时不上传这个,我可能会在不久的将来研究它。
在 iOS 我试图将视频上传到我自己的网站,为此我使用 FileReader.readAsArrayBuffer 方法,块大小为 1048576。
我在 onprogress 事件触发时上传块,除了更大的文件外,所有这一切实际上都很完美。尝试上传 1.33GB 的文件时,调用 readAsArrayBuffer 方法时出现内存不足异常。
我猜这是因为它试图为整个文件保留内存,但这不是必需的。有没有办法在不为整个文件保留内存的情况下从文件中读取二进制块?或者还有其他解决方案吗?
谢谢!
今天改了插件代码自己修好了,这是原代码:
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 属性 为真时,它只 returns 块,不为整个文件保留内存,当它为假时,它像以前一样工作.
我从未使用过 github(除了提取代码)所以我暂时不上传这个,我可能会在不久的将来研究它。