我正在试图弄清楚这里发生了什么。我有以下代码:
# compress and force a download of the .zip
`cd /srv/www/domain.net/www/cgi-bin/admin/amazon_template_tmp/; tar -cvvf files.tar *`;
my $filepath = '/srv/www/domain.net/www/cgi-bin/admin/amazon_template_tmp/files.tar';
my $file = \do { local *FH; *FH };
open $file, "<$filepath" or die "Unable to open file '$filepath': $!";
binmode $file;
binmode STDOUT;
print $IN->header($IN->file_headers(
filename => "csv_files.tar",
mimetype => 'application/gzip',
inline => 0,
size => -s $filepath
));
{
local $\;
while (read($file, my $chunk, 4096)) {
print $chunk;
}
}
这告诉脚本将该文件夹压缩为.tar文件,然后抓取并下载。有几个问题:
1)如果我将文件(通过FTP下载)与我的脚本正在下载的文件(通过浏览器)进行比较,则会损坏utf8字符:
2)下载的文件(通过浏览器)在WinRar中打开 - 但它只包含第一个文件(而不是所有文件)。我得到的错误是:
! C:\ Users \ Andy \ AppData \ Local \ Temp \ csv_files-1.tar:存档是 腐败
有人能指出我正确的方向吗?我以为我的所有binmode
/ STDOUT
内容设置正确,所以我有点困惑!
作为更新:以下是传递给浏览器的标头:
Content-type: application/gzip
Content-Disposition: attachment; filename="csv_files.tar"; size=71680
Content-Length: 71680
我也尝试过这种方法来打印内容:
open FILE, "< $filepath" or die "can't open : $!";
binmode FILE;
local $/ = \10240;
while (<FILE>){
print $_;
}
close FILE;
虽然仍然不高兴。我差不多放弃了,只是对文件进行Location:
重定向,所以浏览器以这种方式下载(这只是一个管理后端工具,这就是为什么我甚至可以读取文件的原因)虽然它在cgi-bin中)
答案 0 :(得分:0)
好的 - 我不太确定发生了什么,但我设法让它发挥作用。我拿出了打印标题的函数:
print $IN->header($IN->file_headers(
filename => "csv_files.tar",
mimetype => 'application/x-download',
inline => 0,
size => -s $filepath
));
并将其替换为我自己的简单标题:
print qq|Content-type: application/x-download\nContent-Disposition: attachment; filename="csv_files.tar"\n\n|;
我想知道在$ IN模块中是否与此有关:
binmode(STDOUT, ":utf8");