我正在使用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
}
我的问题:
答案 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,','')