将base64正确解码为Blob吗?

施乐

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

使用FileReader.readAsDataURL,我可以选择一个文件并检索其base64编码。问题开始于服务器端,当我使用PERL MIME :: Base64 encode_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解码算法:

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字符“,”之后进行解码,但是会产生错误。
斯蒂芬·乌尔里希(Steffen Ullrich)

您的问题不在显示的代码范围内。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

这恰好是您在解码输出中看到的无效标头。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章