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

Dav*_*ave 1 perl zip file-upload http

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

在HTTP标头的MIME部分,它看起来像这样:

Content-Disposition: form-data; name="el_upload_file_0"; filename="BugReport.zip";\r\n
Content-Type: application/octet-stream\r\n\r\n
Run Code Online (Sandbox Code Playgroud)

在我的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;
Run Code Online (Sandbox Code Playgroud)

不断保存的文件以某种方式损坏并且不是有效的zip文件.HTTP请求是由C#应用程序发送的,它可能正在发送损坏的zip文件,但我对此表示怀疑.我有什么办法可以进一步排除故障吗?

tad*_*man 5

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

一次性阅读整个内容,或者如果必须,请以合理大小的块来完成.在这个例子中,它以1024字节的块读取,但你可以轻松使用更大的值,如16MB(1 << 24)或任何看似合适的值:

my $data;
while (read($upload_file, $data, 1024))
{
  print TMP, $data;
}
Run Code Online (Sandbox Code Playgroud)