我正在尝试从手机中的相册中选取的图像中获取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编码。
答案 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;
});