Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在表单提交时使用Perl下载文件_Perl_Filehandle_Save As - Fatal编程技术网

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

在表单提交时使用Perl下载文件,perl,filehandle,save-as,Perl,Filehandle,Save As,我正在尝试在表单提交上启动另存为对话框。我的表单非常简单,用于拖放文件,如下所示: <form action="action.epl" class="dropzone" id="dropzone" method="post"> </form> 因此,当用户删除提交的文件并启动action.epl时。在action.epl中,我处理文件并将其保存到服务器。然后我试着把文件的加密版本吐出来。加密已经完成,我已经删除了它,以确保它不是问题的根源,我现在的问题是,我无法从服

我正在尝试在表单提交上启动另存为对话框。我的表单非常简单,用于拖放文件,如下所示:

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

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

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

打开(文件,“我看到您在教程中解决了输入错误

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

应为
“内容类型:应用程序/x-download\n”
,以将内容类型指定为“应用程序/x-download”,并将“\n”指定为标题字段行的结尾

在此之后,您将了解浏览器如何处理响应。如果您提供
内容配置:attachment;filename=$filename
头,您将断言附件应该是给定的文件名
$filename
。许多浏览器将查看文件名,并尝试嗅探适合t的MIME类型因此,如果你指定
$filename
是一个
.pdf
,那么对于现代浏览器,“如果它看起来像pdf,闻起来像pdf,那么它就是pdf”。你不仅仅是说“这是pdf”根据您的内容配置规范,您还提供了他们下载的文件的名称。在大多数情况下,这应该可以防止回退“另存为”行为

最好的办法是不提供内容配置。这样,您就没有指定任何默认名称来保存文件,因此浏览器没有可用于窥探的扩展名。不幸的是,某些浏览器只是默认脚本的名称,即使扩展名与内容相比是荒谬的。在某些情况下我在日常工作中处理的“企业解决方案”,我得到了名为“report.cgi”的.csv文件,因为它们使用只有Internet Explorer才能识别的MIME类型,并且它们不提供内容配置。请注意

底线是你不能强迫浏览器从服务器端打开“另存为”,除非你有关于浏览器的信息并且知道如何欺骗它,或者你只是不给它任何依据(甚至有些浏览器可能有默认约定)

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

我所做的是使用perl的File::Type和mime_Type函数来获取mime类型,并简单地指定一个名称。如果使用mime_Type函数来确定mime类型,而不指定要返回的文件,则会得到一些愚蠢的事情,例如.xlsx文件作为zip文件下载,或者其他荒谬的事情

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


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

您的HTTP头和正文之间需要一条空行。此外,与其将文件读入数组并打印,不如边读边打印:
打开我的$fh',此外,每个头都应该在它自己的行上:
print“Content-Type:foo\n”…
Oops,
s/fileglobs/typeglobs/
在我的第一条评论中。我进行了编辑,在标题后添加了新行和额外的新行。我还以不同的方式使用open。此外,我还有“x-downloadn”我意识到这是教程中的一个拼写错误。如果只是修复它就可以修复整个问题。
     $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
     $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;