Der folgende Code ist der Originalcode eines Perl CGI-Skripts, das wir verwenden. Selbst für sehr große Dateien scheint es zu funktionieren, aber nicht für wirklich große Dateien.Nicht genügend Arbeitsspeicher für eine sehr große Binärdatei über HTTP
Der aktuelle Code ist:
$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;
Wenn ich den Code richtig verstehen, ist es die gesamte Datei in den Speicher geladen wird, bevor „Drucken“ es. Ich nehme an, es wäre viel besser, es per Chunk zu laden und anzuzeigen. Aber nachdem ich viele Foren und Tutorials gelesen habe, bin ich immer noch nicht sicher, wie es am besten geht, mit Standard-Perl-Bibliotheken ...
Letzte Frage, warum wird "binmode" am Ende angegeben?
Vielen Dank für jeden Hinweis oder Rat,
Diese Frage eng mit [Warum ist mein Bild herunterladen CGI-Skript geschrieben in Perl nicht? ] (https://stackoverflow.com/q/10563275/100754), in dem der Code in beiden anscheinend kopiert worden ist von der gleichen beschissenen Tutorialseite. Siehe auch meinen Blog-Beitrag [Ein CGI-Skript zum Herunterladen von Dateien in Perl] (https://www.nu42.com/2012/05/file-download-cgi-script-in-perl.html), das ich als Antwort darauf geschrieben habe Frage. Die beiden Fragen sind keine genauen Duplikate, weil sie aus verschiedenen Gründen versagen. –
** "Warum wird" binmode "am Ende angegeben?" ** ... Weil jemand, der nicht wusste, was er tat, Code von einem Tutorial kopierte, das von jemand anderem geschrieben wurde, der auch nicht wusste, was er tat. Da das eigentliche Datei-Handle 'DLFILE' ist, wird' binmode'ing '$ DLFILE' tatsächlich sowieso nichts tun, egal wo es platziert ist. Sein einziger Zweck im Leben besteht darin, anzuzeigen, dass die inkompetente Person, die das Drehbuch schrieb, nicht "streng" verwendete. –
Dieses * dumme * 14 Jahre alte Skript: 'https: // www.sitepoint.com/datei-download-script-perl /' –