2012-03-06 63 views
4

我试图摆脱从我的手机上的专辑选择了一个形象的base64,但我不能让它工作:从imageURI获取Base64编码与PhoneGap的

我尝试这样做:

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编码。

+0

喜其易已经给出例子,是裁判......这个链接.. [这里](http://stackoverflow.com/questions/20280911/encoding-a-image -to-base64并上传到网络电话服务/ 22910216#22910216) – kathir 2014-04-08 07:08:19

回答

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

注:需要约20秒读取一次正常5MPixel图像和10-15为Base64编码。

+0

20? 20小时?年份? – Danny 2013-01-31 03:54:35

+0

@Danny秒.. :) – SERPRO 2013-01-31 10:03:19

+0

如何获得base 64的字符串值?我想将base 64字符串保存到sqlite。如何使用“image64.value”。 – 2015-02-10 01:56:36

7

从SERPRO上述方法工作...但我不得不改变

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

因此,线

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

可以被移除,并且BASE64结果可直接提取为

image64.value = evt.target.result; 
0

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,并触发加载。此时, result属性将数据作为表示 文件数据的URL作为base64编码字符串。

用法:

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