下面的代碼是我們正在使用的Perl CGI腳本的原始代碼。即使對於非常大的文件,它似乎也能正常工作,但對於非常大的文件卻不適用。通過HTTP提供非常大的二進制文件時內存不足
當前的代碼是:
$files_location = $c->{target_dir}.'/'.$ID;
open(DLFILE, "<$files_location") || Error('open', 'file');
@fileholder = <DLFILE>;
close (DLFILE) || Error ('close', 'file');
print "Content-Type:application/x-download\n";
print "Content-Disposition:attachment;filename=$name\n\n";
print @fileholder;
binmode $DLFILE;
如果我理解正確的代碼,它加載在內存中的整個文件「打印」之前。當然,我認爲加載並按塊顯示會好很多。但在閱讀了很多論壇和教程後,我仍然不確定如何最好地使用標準Perl庫...
最後一個問題,爲什麼在末尾指定了「binmode」?
非常感謝任何提示或建議,
這個問題是密切相關[爲什麼我的圖像下載CGI腳本用Perl編寫不工作? ](https://stackoverflow.com/q/10563275/100754),因爲兩者中的代碼似乎都已被複制來自同一個蹩腳的教程網站。另請參閱我的博客文章[文件下載Perl中的CGI腳本](https://www.nu42.com/2012/05/file-download-cgi-script-in-perl.html)題。這兩個問題並不完全重複,因爲它們因不同原因而失敗。 –
**「爲什麼」binmode「最後指定?」** ...因爲不知道他們在做什麼的人從其他人不知道他們在做什麼的教程中複製代碼。事實上,由於實際的文件句柄是'DLFILE',因此無論如何,'bin_ode'ing'$ DLFILE'都不會做任何事情,無論它放在哪裏。它唯一的目的是要表明寫劇本的無能的人不會「嚴格地使用」。 –
這個*笨的* 14歲的腳本:'https://www.pointpoint.com/file-download-script-perl /' –