在表单提交上使用Perl下载文件

时间:2015-03-31 20:33:58

标签: perl filehandle save-as

我正在尝试在表单提交上启动“另存为”对话框。我的表单非常简单,我使用Dropzonejs作为拖放文件,它看起来像这样:

<form action="action.epl" class="dropzone" id="dropzone" method="post">
</form>

因此,当用户删除文件时,它会提交并启动action.epl。在action.epl中,我处理文件并将其保存到服务器。然后我试图吐出一个加密版本的文件。加密已完成,我已删除它以确保它不是问题的根源,我现在的问题是我无法从服务器下载它。我有以下内容(也在action.epl中):

     $fileName = 'file.pdf';
     $filepath= "/server/path/$fileName";

     open (FILE, "<$filepath") or die "can't open : $!";
     @fileholder = <FILE>;
     close FILE;

     print "Content-Type:application/x-downloadn";
     print "Content-Disposition:attachment;filename=$fileName";
     print @fileholder

它正在执行/ something /因为提交所需的时间是没有此代码段的5倍。我认为我会得到的是&#34;另存为&#34;对话但没有任何反应。 This tutorial是我获取信息的地方。

编辑,现在我有:

     $fileName ='file.pdf';
     $filepath = "/server/path/$fileName";

     print "Content-Type:application/x-download\n";
     print "Content-Disposition:attachment;filename=$fileName\n\n";

     open FILE, '<', $filepath or die "can't open: $!";
     print while <FILE>;
     close FILE;

但是,仍然没有对话框。我看到你有&#34; $&#34;在你的文件句柄中的sigil。我也试过了。但我不认为你需要那个吗?

1 个答案:

答案 0 :(得分:0)

我看到你解决了教程中的拼写错误。

  

“内容类型:应用程序/ x-downloadn”

应为"Content-Type: application/x-download\n",将内容类型指定为“application / x-download”,将“\ n”指定为标题字段的行。

之后,您将了解浏览器如何处理响应。如果您提供Content-Disposition:attachment;filename=$fileName标头,则表示附件应该是给定的文件名$filename。许多浏览器会查看文件名,并尝试为扩展名嗅探合适的MIME类型。因此,如果您指定$filename.pdf,那么对于现代浏览器,“如果它看起来像pdf并闻起来像pdf,那么它就是一个pdf”。您不仅使用Content-Disposition的规范说“这是一个pdf”,而且还提供他们下载的文件的名称。在大多数情况下,这应该可以防止后退“另存为”行为。

您最好的选择是不提供内容处理。这样,你没有指定任何默认名称来保存文件,因此浏览器没有扩展名来窥探。不幸的是,有些浏览器只是默认使用脚本的名称,即使扩展名与内容相比是荒谬的。在我日常处理的一些“企业解决方案”中,我得到名为“report.cgi”的.csv文件,因为它们使用的是只有Internet Explorer识别的MIME类型,并且它们不提供内容处置。买家要小心。

最重要的是,您不能强制浏览器从服务器端打开“另存为”,除非您有关于浏览器的信息并知道如何欺骗它,或者您根本不给它任何东西经过(甚至一些浏览器可能有默认约定)。

通过指定Content-Disposition和文件名,您将提供有关文件应该是什么以及应该保存为什么的提示。另一方面,如果除了Content-Type是'application / x-download'之外你没有给浏览器任何其他提示,那么你可能会得到一个“另存为”对话框,但是用户将不知道数据是什么类型的内容。这使您受浏览器默认命名约定的支配。这就是我将.csv文件作为“report.cgi”的方式,即使服务器为csv文件提供MIME类型(尽管只有IE的风格)。

我所做的是使用perl的File :: Type和mime_type函数来获取mime类型并简单地指定一个名称。如果你使用mime_type函数来确定MIME类型,并且没有指定要返回的文件,你会得到像.xlsx文件作为zip文件下载或其他荒谬的愚蠢的东西。

他们获得“另存为”对话框的重要性,因为在一天结束时,如果文件的内容不适合该类型并且他们尝试打开,那么他们选择的文件类型是无关紧要的acrobat中的excel文件,反之亦然。

在我多年的服务器端编程经验中,我总是发现尝试控制客户端是徒劳的。