用于提供PDF文件的Perl CGI脚本

时间:2017-11-21 09:35:50

标签: perl file header cgi

而不是在html页面中使用如下链接:

<a href="http://www.somesite.com/path/to/file.pdf">Display file</a>

我想从远程用户模糊文件的路径。 所以我写了一个Perl CGI脚本,这里显示了一个简化版本:

#!/usr/bin/perl -T

use strict;
use warnings;
use CGI qw/:all/;

my $basepath = '/some/path/to';
my $f = param("f") || '';

($f eq '') && die;

my $path = "$basepath/$f.pdf";

open(PATH, "<$path") || die;
binmode PATH;

print header(-type => "application/pdf",
             -target => "$f");
print;

while (<PATH>) {
    print($_);
}
close(PATH);

我将此脚本保存为$ htdoc / cgi-bin / getpdf.cgi,然后在html文件中使用以下URL:

<a href="http://www.somesite.com/cgi-bin/getpdf.cgi?f=file">Display file</a>

此脚本有效,但显示给用户的文件名是脚本的名称(getpdf.cgi),而不是所服务文件的名称(file.pdf)。这不是很好,因为无论提供什么文件,文件名都是getpdf.cgi。我希望它是实际的文件名(在URL中作为f = param传递,附加.pdf扩展名)。

我尝试使用以下标题()而不是上面脚本中的内容:

print header(-type => "application/pdf",
             -target => "$f",
             -attachment => "$f.pdf");

注意添加的-tatachment行。这会将文件名覆盖为file.pdf,但会导致浏览器打开&#34;另存为&#34;对话框窗口,而不仅仅是显示文件。

如何解决这个问题?

更新: TUrns我需要在标题中包含以下内容:

Content-Type: application/pdf
Content-Disposition: inline; filename="$f.pdf"

使用CGI.pm的header()方法可以轻松生成第一个标题行:

print header(-type => 'application/pdf');

但是CGI.pm没有给我一种方法来生成第二行,至少不是服务器上的版本。如果我使用以下代码:

print header(-type => 'application/pdf', -attachment => "$f.pdf");

然后生成的标题如下所示:

Content-Type: application/pdf
Content-Disposition: attachment; filename="$f.pdf"

有&#34;附件&#34;导致浏览器弹出&#34;另存为&#34;我不想成为默认行为的对话框。我想&#34;内联&#34;,但header()没有参数。

我还发现我不能使用多个header()调用,这似乎会导致忽略第一个之后的所有内容。

因此解决方案根本不使用header(),而只是显式调用print()来输出所需的标题行,再加上一个空白行来表示标题的结尾。

我在Chrome,Firefox和IE上测试了这个。它们按预期显示PDF文件。如果我尝试下载它,则Chrome和Firefox上默认提供正确的文件名。在IE上,它仍然显示默认文件名为getpdf.cgi。

在这一点上,我认为我只是把它当作另一个IE&#34; bug&#34;并留在那。

0 个答案:

没有答案