我正在使用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
}
我的问题:
您的问题不在显示的代码范围内。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] 删除。
我来说两句