Использование 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);
}