gpt4 book ai didi

perl - Base64 正确解码为 blob?

转载 作者:行者123 更新时间:2023-12-02 04:15:32 24 4
gpt4 key购买 nike

我正在使用 websocket 开发一个项目,并尝试将选定的文件上传到服务器。

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

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

即:Test.XLS 文件大小为 29696 字节,在服务器中解码后为 2972​​0 字节,24 个“ header 字节”为(十六进制): 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”只是“私有(private)事件”,也许对于其他情况,“标题”会有所不同,我不知道。
  2. Base64 没有所有文件之间的标准?
  3. 我尝试仅在“,”之后解码纯 Base64 字符,但会产生错误。

最佳答案

您的问题超出了您显示的代码范围。 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

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

关于perl - Base64 正确解码为 blob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34035761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com