С помощью этого кода вы можете загружать большие изображения, поскольку они записаны блоками по 1 МБ, вместо того, чтобы делать всю запись одновременно. Без записи 1 МБ я не смог написать файлы размером более 4 МБ, но с этим я без проблем протестировал файлы размером до 40 МБ.
va "закатывает" (собирается осудить) cordovan-plugin-file, см.их блог.
Сообщество разработчиков Cordova больше не будет работать над плагином для передачи файлов. Вы можете продолжать использовать плагин для передачи файлов, если хотите - он должен работать как обычно в обозримом будущем. Мы настоятельно рекомендуем пользователям Cordova перейти на использование стандартного способа отправки и получения двоичных данных.
Они поощряют переход к использованию запросов XHR2 (запросы XHR, гдеresponseType установлен вкапля или жеArrayBuffer.
В сообщении блога приведен пример того, как двоичные данные могут быть получены с помощью XHR2:
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fs) {
console.log('file system open: ' + fs.name);
fs.root.getFile('bot.png', { create: true, exclusive: false }, function (fileEntry) {
console.log('fileEntry is file? ' + fileEntry.isFile.toString());
var oReq = new XMLHttpRequest();
// Make sure you add the domain name to the Content-Security-Policy <meta> element.
oReq.open("GET", "http://cordova.apache.org/static/img/cordova_bot.png", true);
// Define how you want the XHR data to come back
oReq.responseType = "blob";
oReq.onload = function (oEvent) {
var blob = oReq.response; // Note: not oReq.responseText
if (blob) {
// Create a URL based on the blob, and set an <img> tag's src to it.
var url = window.URL.createObjectURL(blob);
document.getElementById('bot-img').src = url;
// Or read the data with a FileReader
var reader = new FileReader();
reader.addEventListener("loadend", function() {
// reader.result contains the contents of blob as text
});
reader.readAsText(blob);
} else console.error('we didnt get an XHR response!');
};
oReq.send(null);
}, function (err) { console.error('error getting file! ' + err); });}, function (err) { console.error('error getting persistent fs! ' + err); });
У меня есть некоторые проблемы с пониманием кода выше и намерением Cordova отказаться от плагина передачи файлов в пользу прямой загрузки BLOB-объектов через Ajax.
Я вижу это правильно:fs.root.getFile
создает файл. Обработчик успеха загрузки (oReq.onload
) не пытается записать извлеченный большой двоичный объект в созданный файл. Нет четкой причины, по которой создается fileEntry. Если бы я хотел сохранить извлеченный большой двоичный объект в созданный FileEntry, вoReq.onload
Я мог бы продолжать использовать FileWriter, но только для небольших (я читаю до 5 МБ) файлов (поскольку BLOB-объект обрабатывается в памяти). В блоге рассказывается о том, как вообще можно получить блоб, а не о том, как его можно загрузить в файловую систему. Если я захочу скачать файлы большего размера (например, пару сотен МБ), то отойти от cordova-plugin-filetransfer сейчас не вариант.