PERL CGI多种内容类型。如何下载文件和查看内容。

时间:2014-01-10 18:14:09

标签: perl cgi

打印文件(在服务器上)内容并提供直接下载链接的页面。

Download File HERE

Start contents of file:
line 1
line 2
line 3
...

我不确定允许下载链接和HTML文本的最佳方式和正确的标题。这打印出空白

            print $mycgi->header(
                   -cookie => $mycookie, 
                    -Type => "application/x-download"
                    -'Content-Disposition'=>'attachment; filename="FileName"'
              );

1 个答案:

答案 0 :(得分:1)

您可以包含指向脚本的链接,并将文件名作为参数传递。链接可能如下所示:

http://url/to/script?action=download&file=foo

在下面,只需打印文件的内容:

#!/usr/bin/perl -T

use strict;
use warnings;

use CGI qw/escapeHTML/;

my $q = CGI->new;

print $q->header,
      $q->start_html('foo'),
      $q->a({ -href => 'http://url/to/script?action=download&file=foo' }, 'Click to download'),
      "<pre>";

open my $fh, "<", "/path/to/file" or die $!;

print escapeHTML($_) while <$fh>;

close $fh;

print "</pre>", $q->end_html;

请注意,您应该使用escapeHTML()来阻止浏览器以HTML格式呈现文件中的任何内容(仅<pre>标记不会处理)。

action参数设置为download的情况下调用脚本时,请像上面一样使用application/x-download内容类型:

my $q = CGI->new;

# Untaint parameters
my ($action) = ($q->param('action') =~ /^(\w+)$/g);
my ($file)   = ($q->param('file') =~ /^([-.\w]+)$/g);

# Map file parameter to the actual file name on your filesystem.
# The user should never know the actual file name. There are many
# ways you could implement this.
???

if ($action eq "download") {
    print $q->header(
        -type => "application/x-download",
        -'Content-Disposition' => 'attachment; filename="FileName"'
    );

    open my $fh, "<", $file or die "Failed to open `$file' for reading: $!";

    print while <$fh>;

    close $fh;
}

请注意,您还需要在响应正文中打印文件的内容。