2014-11-24 3 views
0

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

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-файл, но когда я пытаюсь открыть, например, образ, он говорит, что он поврежден. Я не нашел подходящего решения. Кажется, проблема связана с базовым содержимым, поступающим из API. Проходил ли кто-нибудь такой вопрос?

ответ

0

я выяснить проблемы:

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

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

data = data.split('base64,')[1];