在iOS上,我尝试将视频上传到自己的网站上,为此,我使用FileReader.readAsArrayBuffer方法,chunkSize为1048576。
当onprogress事件触发时,我上传了块,所有这些实际上都可以正常运行,除了较大的文件。尝试上传1.33GB的文件时,调用readAsArrayBuffer方法时出现内存不足异常。
我猜这是因为它试图为整个文件保留内存,但这不是必需的。有没有一种方法可以从文件中读取二进制块,而无需为整个文件保留内存?还是有其他解决方案?
谢谢!
答案 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(除了拉代码),所以我暂时不上传它,我可能会在不久的将来进行研究。