Поврежденные файлы изображений после создания zip-файла с помощью Cordova FileReader API

Я создаю приложение Cordova и использую FileReader API для чтения доступных изображений, видео и аудио файлов, чтобы создать zip-файл. Мой код, как показано ниже:

self.dataReader = function(uri) {
    var deferred = $q.defer();
    window.resolveLocalFileSystemURI(uri, function(fileEntry) {
        fileEntry.file(function(file) {
            var reader = new FileReader();
            reader.onloadend = function(evt) {
                deferred.resolve(evt.target.result);
            };
            reader.readAsDataURL(file);
        });
    }, function(error) {
        if (error.code == FileError.NOT_FOUND_ERR) deferred.reject("Message : NOT_FOUND_ERR");
        else if (error.code == FileError.SECURITY_ERR) deferred.reject("Message : SECURITY_ERR");
        else if (error.code == FileError.ABORT_ERR) deferred.reject("Message : ABORT_ERR");
        else if (error.code == FileError.NOT_READABLE_ERR) deferred.reject("Message : NOT_READABLE_ERR");
        else if (error.code == FileError.ENCODING_ERR) deferred.reject("Message : ENCODING_ERR");
        else if (error.code == FileError.NO_MODIFICATION_ALLOWED_ERR) deferred.reject("Message : NO_MODIFICATION_ALLOWED_ERR");
        else if (error.code == FileError.INVALID_STATE_ERR) deferred.reject("Message : INVALID_STATE_ERR");
        else if (error.code == FileError.SYNTAX_ERR) deferred.reject("Message : SYNTAX_ERR");
        else if (error.code == FileError.INVALID_MODIFICATION_ERR) deferred.reject("Message :  INVALID_MODIFICATION_ERR");
        else if (error.code == FileError.QUOTA_EXCEEDED_ERR) deferred.reject("Message : QUOTA_EXCEEDED_ERR");
        else if (error.code == FileError.PATH_EXISTS_ERR) aledeferred.reject("Message : PATH_EXISTS_ERR");
    });
    return deferred.promise;
}

self.packMedia = function(results, type, zip) {
    var deferred = $q.defer();
    var folder;
    if (type == 1)
        folder = zip.folder("images");
    else if (type == 2)
        folder = zip.folder("videos");
    else
        folder = zip.folder("audios");
    var i = 0;
    var sending = [];
    var stp = $interval(function() {
        if (i < results.length) {
            if (sending[i] !== 's') {
                sending[i] = 's';
                self.dataReader(results[i].url).then(function(data) {
                    folder.file(results[i].name, data, {
                        base64: true
                    });
                    i++;
                }, function(msg) {
                    i++;
                });
            }
        } else {
            $interval.cancel(stp);
            stp = undefined;
            sending = [];
            deferred.resolve(zip);
        }
    }, 100);
    return deferred.promise;
}

Этот код прекрасно создает zip-пакеты без каких-либо проблем с включенными текстовыми файлами, но все медиа-файлы повреждены. Я могу открыть ZIP-файл, но когда я пытаюсь открыть, например, изображение, он говорит, что поврежден. Я не мог найти правильного решения. Кажется, проблема с контентом base64, полученным из API. Кто-нибудь проходил через такую ​​проблему?

1 ответ

Я выяснил проблему:

Проблема заключалась в том, что метатег base64 стоял перед данными base64.

Реализация приведенного ниже кода перед данными base64, поступающими от читателя, решила проблему:

data = data.split('base64,')[1]; 
Другие вопросы по тегам