14

我的 PhoneGap 应用程序有问题。我想写一个 15 MB 的文件。如果我尝试操作系统会提取越来越多的内存并且应用程序崩溃而没有消息。我可以在安卓和黑莓平板电脑上重现这个。有没有办法更有效地实现写作?

最好的祝福

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 开发人员不会为此苦恼;)

4

2 回答 2

22

我找到了答案。

崩溃原因:PhoneGap FileWrite.write 无法处理太大的缓冲区,不知道确切大小,我认为这个问题是由于 PG 通过 URL Scheme 向 iOS 传输数据,当“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);
}

2014 年 8 月 12 日更新:

在我的实践中,通过 Cordova FileSystem 保存文件的性能并不好,特别是对于手机上的大文件(>5M),需要几秒钟。如果您正在从服务器下载文件到本地磁盘,您可能需要一种“高效且直接”的方式,请尝试使用 cordova-plugin-file-transfer插件。

于 2013-12-12T08:38:52.870 回答
8

@Imskull 的答案是正确的...我只想为 Blob 放入一个(确保它是 blob 而不是 arraybuffer),它是基于顶部的那个更新的...我还添加了一行向自己保证我正在添加到文件的末尾......这足以让你的应用程序停止崩溃(主要在 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);
}
于 2016-09-15T08:04:27.400 回答