2016-07-15 21 views
1

我需要從Android中的文件系統讀取PDF以將其發送到服務器。但我似乎無法讀取有效的數據。如何在Android中讀取有效的base64文件? (cordova)

我試過readAsDataURL,因爲它看起來是最快的。但是,返回的值(在刪除MIME類型後)是無效的base64。

 // read the file from the filesystem 
    window.resolveLocalFileSystemURL(path, 
    function (fileEntry) { 
     fileEntry.file(function (file) { 
     var reader = new FileReader(); 

     reader.onloadend = function (evt) { 

      // test base64 is valid 
      var patt = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/; 
      var b64 = evt.target.result.split(",", 2)[1]; 
      console.log("is valid base64? " + patt.test(b64)); // false! 

      var bytes = atob(b64); // Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded. 
     }; 

     //reader.readAsText(file); 
     reader.readAsDataURL(file); 
     }, 
     function (err) { 
      console.error(err); 
     }); 
    }, function (err) { 
     console.error(err); 
    }); 

我自己也嘗試readAsText然後轉換成的base64這一點我自己,但是這是一個較大的PDF文件慢得令人難以置信,當翻譯回的數據是無效的。

爲什麼從readAsDataURL的base64無效?我嘗試了多種Android設備(有和沒有人行橫道)。使用最新版本的file插件。

+0

如果您需要從設備發送PDF到服務器,是否考慮過使用cordova-plugin-filetransfer來存檔您的目標? https://github.com/apache/cordova-plugin-file-transfer – Frix33

+0

這是一個很好的觀點,但在這種情況下,由於用戶正在構建一條消息以發送到包含base64數據的服務器,因此這是不可能的。我需要首先將數據存儲在稍後與其他信息捆綁在一起的數據中。 – Dylan

回答

0

這是一個已知和報道的Cordova File插件問題。

FileReader readAsDataURL在base 64編碼大型文件時有問題。使用的過程如下:

  • base64對每個256K塊進行編碼。
  • 附加任何base64編碼的256K塊。
  • 返回結果。

結果不是有效的base64編碼字符串,而是由多個有效的base64編碼字符串組成的字符串。

一種解決方法不是解碼結果,而是將數據分割爲256K塊的一部分,分別解碼每個塊,然後您將能夠重新編碼整個字符串。

關於the issue,它被標記爲影響Android 4.4.2,但問題仍然存在於Android 5中& 6.關於分辨率,它仍然沒有分配給任何人。

相關問題