Получить Base64 из imageURI с PhoneGap - PullRequest
4 голосов
/ 06 марта 2012

Я пытаюсь получить base64 из изображения, которое выбрано из альбома на моем телефоне, но я не могу заставить его работать:

Я пробовал это:

window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) {
    console.log("0");
    fileSystem.root.getFile(imageURI, null, function(fileEntry) {
        console.log("1");
        fileEntry.file(function(file) {
            console.log("2");
            var reader = new FileReader();
            reader.onloadend = function(evt) {
                console.log("Read complete!");
                image64.value = Base64.encode(evt.target.result);
            };
            reader.readAsText(file);
        }, failFile);
    }, failFile);
}, failSystem);

Хотяизображение отображается правильно .. Я получаю сообщение об ошибке от этой функции:

fileSystem.root.getFile(imageURI, null, function(fileEntry)

И ошибка: FileError.ENCODING_ERR

Я знаю, что код не 'выглядит красиво.Но я не знаю, как получить кодировку Base64 из imageURI.

Ответы [ 3 ]

7 голосов
/ 29 августа 2012

Вышеприведенный метод от SERPRO работает ... но я должен изменить

reader.readAsText(file);
to
reader.readAsDataURL(file);

Таким образом, строка

image64.value = Base64.encode(evt.target.result);

можно удалить, а результат base64 можно напрямую извлечь как

image64.value = evt.target.result;
7 голосов
/ 06 марта 2012

Я нашел решение в Google groups . Я немного изменил его, и вот результат:

var gotFileEntry = function(fileEntry) { 
    console.log("got image file entry: " +  fileEntry.fullPath); 
    fileEntry.file( function(file) {
        var reader = new FileReader();
        reader.onloadend = function(evt) {
            console.log("Read complete!");
            image64.value = Base64.encode(evt.target.result);
        };
        reader.readAsText(file);
    }, failFile);
};

window.resolveLocalFileSystemURI(imageURI, gotFileEntry, failSystem); 

ПРИМЕЧАНИЕ: Для считывания обычного 5-мегапиксельного изображения требуется около 20 секунд, а для кодирования еще от 10-15 до Base64.

0 голосов
/ 13 февраля 2018

Cordova-plugin-file реализует HTML5 File API и использует API обратного вызова. Я предпочитаю обещания, поэтому переписал метод с использованием библиотеки $ q:

function getContentAsBase64(fileUrl) {

  //Using $q to change the API so that getContentAsBase64 returns a promise
  var deferred = $q.defer();

  //function to call when either resolve or retrieval fails
  var fail = function (error) {
    errorHandler(error);
    deferred.reject(error);
  }

  //function to call when resolve file succeeded
  //we have a FileEntry - get the file, 
  var fileResolved = function (fileEntry) {
    fileEntry.file(fileSuccess, fail);
  }

  //function to call when file successfully retrieved
  //convert to base64 string
  var fileSuccess = function (file) {

    var reader = new FileReader();
    reader.onloadend = function (evt) {
      //promise is resolved with the base64 string
      deferred.resolve(evt.target.result);
    };
    reader.readAsDataURL(file);
  };

  window.resolveLocalFileSystemURL(fileUrl, fileResolved, fail);
  return deferred.promise;
}        

Метод readAsDataURL используется для чтения содержимого указанный BLOB-объект или файл. Когда операция чтения завершена, readyState становится DONE, и загрузчик запускается. В это время атрибут результата содержит данные в виде URL, представляющего Данные файла в виде строки в кодировке base64.

Использование:

var imageData;
getContentAsBase64(aq.FileUri).then(function (content) {
   imageData= content;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...