打印文件(在服务器上)内容并提供直接下载链接的页面。
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"'
);
答案 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;
}
请注意,您还需要在响应正文中打印文件的内容。