繁体   English   中英

使用PhoneGap从imageURI获取Base64

[英]Get Base64 from imageURI with PhoneGap

我正试图从我手机上的相册中选取的图像中获取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编码。

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

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

因此,行

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

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

image64.value = evt.target.result;

我在Google网上找到了解决方案。 我修改了一下这就是结果:

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。

cordova-plugin文件实现HTML5文件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或File的内容。 当读取操作完成时,readyState变为DONE,并且触发了loadend。此时,result属性包含数据作为表示文件数据的URL作为base64编码的字符串。

用法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM