使用PhoneGap从imageURI获取Base64

时间:2012-03-06 12:04:44

标签: android ios blackberry cordova base64

我正在尝试从手机中的相册中选取的图像中获取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

我知道代码看起来不太漂亮。但我不知道如何从imageURI获得Base64编码。

3 个答案:

答案 0 :(得分:7)

我在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); 

注意:读取正常的500万像素图像大约需要20秒,而另一个10-15到Base64需要对其进行编码。

答案 1 :(得分:7)

SERPRO的上述方法有效......但我必须改变

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

因此,行

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

可以删除,base64结果可以直接提取为

image64.value = evt.target.result;

答案 2 :(得分:0)

cordova-plugin文件实现HTML5 File API,并使用回调API。我更喜欢promises所以我用$ 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,并且loadend被触发。那时,   result属性包含数据作为表示的URL   将文件的数据作为base64编码的字符串。

用法:

var imageData;
getContentAsBase64(aq.FileUri).then(function (content) {
   imageData= content;
});