Сохранение экспортируемых таблиц для cordova приложений (iOS)

По умолчанию, стандартный пакет 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;
        }
    });

});

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *