Ошибка нехватки памяти при вызове метода readAsArrayBuffer в FileReader файла cordova-plugin-file (iOS) - PullRequest
0 голосов
/ 01 марта 2019

В iOS я пытаюсь загрузить видео на свой собственный веб-сайт, и для этого я использую метод FileReader.readAsArrayBuffer с chunkSize 1048576.

Я загружаю куски, когда происходит событие onprogress, и всеэто на самом деле работает отлично, за исключением больших файлов.При попытке загрузить файл объемом 1,33 ГБ я получаю исключение нехватки памяти при вызове метода readAsArrayBuffer.

Я полагаю, это связано с тем, что он пытается зарезервировать память для полного файла, однако в этом нет необходимости.,Есть ли способ прочитать двоичный кусок из файла без резервирования памяти для полного файла?или есть другие решения?

Спасибо!

1 Ответ

0 голосов
/ 04 марта 2019

Я сам исправил это сегодня, изменив код плагина, это оригинальный код:

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, оно возвращает только чанки и не резервирует память для всего файла, а когда оно ложно, оно работает так, как раньше.

Я никогдаиспользовал github (за исключением извлечения кода), поэтому я не загружаю это сейчас, я мог бы изучить его в ближайшем будущем.

...