Использование PhoneGap FileWriter.write для "больших" файлов

У меня проблема в приложении PhoneGap. Я хотел бы написать файл размером 15 МБ. Если я попробую ОС вытащить все больше и больше памяти, и приложение сработает без сообщения. Я могу воспроизвести это на планшетах Android и Blackberry. Есть ли способ повысить эффективность написания?

С наилучшими пожеланиями

fe.createWriter(
(fw: any) => {
    fw.onwriteend = (e) => {
        fw.onwriteend = (e) => {
            callback();
        }
        fw.write(data);
    }

    // write BOM (dead for now)
    fw.write("");
},
(error: any) => {
    alert("FileWriter Failed: " + error.code);
});

Это TypeScript, я надеюсь, что разработчики JS не будут бороться с этим;)

Ответ 1

Я нашел ответ.

Причина сбоя:   PhoneGap FileWrite.write не может обрабатывать слишком большой буфер, не знаю точного размера, я думаю   эта проблема связана с передачей данных PG в iOS через схему URL-адресов,    "URL" слишком длинный.

Как это исправить: каждый раз пишите небольшой блок, код ниже:

function gotFileWriter(writer) {
  function writeFinish() {
    // ... your done code here...
  }

  var written = 0;
  var BLOCK_SIZE = 1*1024*1024; // write 1M every time of write
  function writeNext(cbFinish) {
    var sz = Math.min(BLOCK_SIZE, data.byteLength - written);
    var sub = data.slice(written, written+sz);
    writer.write(sub);
    written += sz;
    writer.onwrite = function(evt) {
      if (written < data.byteLength)
        writeNext(cbFinish);
      else
        cbFinish();
    };
  }
  writeNext(writeFinish);
}

ОБНОВЛЕНИЕ Авг 12,2014:

В моей практике производительность сохранения файла через Cordova FileSystem не очень хороша, особенно для большого файла ( > 5M) на телефоне, это занимает несколько секунд. Если вы загружаете файл с сервера на локальный диск, вам может понадобиться "эффективный и прямой" способ, попробуйте cordova-plugin-file-transfer плагин.

Ответ 2

@Imskull ответ правильный... я просто хочу вставить один для Blob (убедитесь, что это blob, а не arraybuffer), который обновляется на основе одного сверху... то, что я также добавил, было строка, чтобы убедиться, что я добавляю в конец файла... этого более чем достаточно, чтобы заставить приложение app перестать сбой (на ios в основном: P)

function gotFileWriter(writer) {
  function writeFinish() {
    // ... your done code here...
  }

  var written = 0;
  var BLOCK_SIZE = 1*1024*1024; // write 1M every time of write
  function writeNext(cbFinish) {
    writer.onwrite = function(evt) {
      if (written < data.size)
        writeNext(cbFinish);
      else
        cbFinish();
    };
    if (written) writer.seek(writer.length);
    writer.write(data.slice(written, written + Math.min(BLOCK_SIZE, data.size - written)));
    written += Math.min(BLOCK_SIZE, data.size - written);
  }
  writeNext(writeFinish);
}