在Perl中下载的tar文件破坏了UTF8(和文件)

时间:2016-12-02 12:59:57

标签: perl

我正在试图弄清楚这里发生了什么。我有以下代码:

# 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字符:

(哎呀,我有这些错误的方法 - 如某人所指出:)) enter image description here

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中)

1 个答案:

答案 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");