正确解码base64到blob?

时间:2015-12-02 05:49:01

标签: perl

我正在使用websocket处理项目,并尝试将所选文件上传到服务器。

使用FileReader.readAsDataURL我可以选择一个文件并检索其base64编码。 问题从服务器端开始,当我使用PERL MIME :: Base64 decode_base64时,即使我得到一个没有任何错误的二进制文件,它的长度在XLS文件的24个字节或ZIP文件的19个字节中更长,并且为空文件是一个RAR文件。

检查二进制结果我得到的是“附加字节”都在文件的开头,根本没有任何意义。

IE:Test.XLS文件大小为29696字节,在服务器中解码后为29720字节,24“头字节”为(十六进制):75 AB 5A 6A 9A 65 89 C6 AD 8A FF BE 77 66 B1 EC 5C 7A 56 DA B1 EE B8。 使用这些字节,文件已损坏。没有这些字节,文件就可以了。

PERL DECODE算法:

use MIME::Base64;
if(open(TXT,"$filepath.tmp")) { # Temporary file contains previously uploaded base64 text encoded using JS FileReader.readAsDataURL
    my @V=<TXT>; close(TXT);
    if(open(DFL,">$filepath")) {
        binmode(DFL);
        print DFL decode_base64(join('',@V)); close(DFL);
        # response back to the client
    }
    else {  } # error response was removed as not relevant for this question
}

我的问题:

  1. 我缺少什么?也许我会“裁剪”标题字节? “24”或“19”只是“私人事件”,也许对于其他情况,“标题”会有所不同,我根本不知道。
  2. Base64在所有文件中没有标准?
  3. 我尝试仅在“,”纯base64字符之后进行解码,但它会产生错误。

2 个答案:

答案 0 :(得分:4)

您的问题超出了您展示的代码范围。 FileReader.readAsDataURL不完全包含数据的base64表示,而是包含如下所示的数据URL:

 data:application/octet-stream;base64,...base64-encoded-data...

如果将其提供给base64解码器,它将尝试将所有内容用作base64,并忽略对base64无效的任何字符。因此,您会在真实内容前面获得一些字节。

您需要在发送数据之前在Javascript代码中或在Perl代码中修复此问题。在Perl中,您可以简单地在真正的base64前面删除所有内容,即

 s{\A.*?;base64,}{}s

根据您的评论,输入文件的第一个字节是:

 data:application/vnd.ms-excel;base64,

这是您需要从文件中删除的部分,base64代码仅在此前缀之后出现。如果您尝试将这些数据解释为base64,则会获得以下字节(作为十六进制)

 75 ab 5a 6a 9a 65 89 c6  ad 8a 89 ff be 77 66 b1 ec 5c 7a 56 da b1 ee b8

这正是您在解码输出中看到的无效标题。

答案 1 :(得分:0)

应用替换: 数据:application / vnd.ms-excel; base64,

在我的情况下是ReactJS,例如:

this.state.archivo_csv.replace('data:application/vnd.ms-excel;base64,','')