如何在Android中读取有效的base64文件? (科尔多瓦)

时间:2016-07-15 21:26:54

标签: javascript android cordova

我需要从Android中的文件系统中读取PDF才能将其发送到服务器。但我似乎无法读取有效数据。

我尝试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插件。

1 个答案:

答案 0 :(得分:0)

这是Cordova文件插件的已知和报告问题。

当base 64编码大文件时,

FileReader readAsDataURL会出现问题。使用的过程如下:

  • base64编码每个256K块。
  • 附加256K的任何base64编码块。
  • 返回结果。

结果不是有效的base64编码字符串,而是一个由多个有效的base64编码字符串组成的字符串。

一种解决方法而不是解码结果是将数据拆分为256K块的一部分,单独解码每个块,然后您将能够重新编码整个字符串。

关于the issue,它被标记为影响Android 4.4.2但问题仍存在于Android 5& 6.关于决议,它仍未分配给任何人。