По умолчанию, стандартный пакет exporter не умеет сохранять экспортируемые файлы в локальную ФС устройства. Но с помощью cordova-plugin-file мы можем это исправить. Работоспособность проверял только под iOS.
/**
* @class Overrides.exporter.File
* @author Dmitry Kazarin <dikazarin@gmail.com>
*
* Сохраняет экспортируемый файл в файловой системе IOS
* Использует функционал cordova-plugin-file
*
**/
Ext.define('Overrides.exporter.File', {
override: 'Ext.exporter.File',
requiresPopup: function() {
// Мы не показываем popup (новое окно) для скачивания файла
// Мы всегда используем blob
return false;
},
}, function(File) {
File.saveBlobAs = Ext.Function.createInterceptor(File.saveBlobAs, function(textContent, fileName, charset, mimeType) {
// Если мы запускаемся под cordova
if (!!window.cordova) {
let uint8 = new Uint8Array(textContent.length),
len = uint8.length,
blob, i;
for (i = 0; i < len; i++) {
uint8[i] = textContent.charCodeAt(i);
}
blob = new Blob([uint8], { type: mimeType || 'plain/text' });
// FileName должен содержать только ascii для совместимости c FS IOS
// TODO объединить ругулярки ниже
fileName = fileName.replace(/[^a-zA-Z0-9-. ]/g, '').replace(/ +/g, ' ');
// Находим путь /Documents/
window.resolveLocalFileSystemURL(cordova.file.documentsDirectory, function (dirEntry) {
// Откроем файл
dirEntry.getFile(fileName, { create: true, exclusive: false }, function (fileEntry) {
fileEntry.createWriter(function (fileWriter) {
fileWriter.onwriteend = function (e) {
Ext.toast(`"${fileName}" saved in Documents folder successfully!`);
};
fileWriter.onerror = function (e) {
Ext.toast(`"${fileName}" saving failed: ${e.toString()}`);
};
fileWriter.write(blob);
});
});
});
return false;
} else {
// Пошли в оригинальную функцию
return true;
}
});
});