我正在尝试使用 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/