perl - 为什么我的 .zip 文件在 HTTP 文件上传后损坏了?

标签 perl http zip file-upload

我正在尝试使用 CGI 脚本接受并保存来自使用 HTTP POST 发送 zip 文件的程序的文件。

在 HTTP header 的 MIME 部分中,它看起来像这样:

Content-Disposition: form-data; name="el_upload_file_0"; filename="BugReport.zip";\r\n
Content-Type: application/octet-stream\r\n\r\n

在我的 CGI 代码中,我使用了这个:

 use CGI;
 use strict;
 my $cgi = CGI->new;
 my $upload_file = $cgi->upload('el_upload_file_0');
 my $time = time;

 my $filename = "/tmp/$time.zip";
 open TMP, ">$filename";
 binmode TMP;
 while (<$upload_file>) {
    print TMP $_;
 }
 close TMP;

不断保存的文件不知何故被破坏并且不是有效的 zip 文件。 HTTP 请求由 C# 应用程序发送,它可能发送损坏的 zip 文件,但我对此表示怀疑。我可以做些什么来进一步排除故障吗?

最佳答案

您正在逐行读取 .zip 文件,这是一个很大的错误。毕竟,行仅与文本文件相关。

一次阅读整个内容,或者如果必须的话,以合理大小的 block 进行阅读。在此示例中,它以 1024 字节 block 的形式读取,但您可以轻松使用更大的值,例如 16MB (1 << 24) 或任何合适的值:

my $data;
while (read($upload_file, $data, 1024))
{
  print TMP, $data;
}

关于perl - 为什么我的 .zip 文件在 HTTP 文件上传后损坏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1444399/

相关文章:

regex - 如何在 perl 中使用 split 函数来完成 awk 的工作

java - 有没有办法在终端中执行包含单个单词(或短语)的 jar 文件?

python - 为什么来自服务器的 cURL 响应是 HTTP/1.0?

apache - 让apache遵循SVN认证

zip - 按偏移量在 ZIP 文件中定位 EOCD

java - 我如何编辑此代码,以便服务器在发送到客户端之前压缩文件,客户端在接收后解压缩该文件

perl - 从 Moose 类中获取所有属性作为散列的更好方法

perl - 使用 unix ksh shell 脚本或 perl 脚本监视文件夹中的新文件并触发 perl 脚本

javascript - 将带有 Perl 变量的内联 javascript 更改为函数

c - 在内存中压缩数据膨胀