2012-03-06 68 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; 
});