[Kobv-opus-tester] Problem beim Download von groesseren Dateien aus OPUS4
Sascha Szott
szott at zib.de
Don Nov 17 17:38:36 MET 2011
Hallo Frau Lapp,
vielen Dank für Ihren Hinweis und das Beifügen einer Lösung!
On 17.11.2011 17:07, Bettina Lapp wrote:
> OPUS 4.1.4 auf Ubuntu Lucid amd64, beim Download grösserer Dateien
> (unabhängig vom Dateityp) wird die Datei beschädigt. Dies geschieht bei
> pdfs, und auch z.B. beim Herunterladen von Quelldateien wie zip oder
> tar.gz Archiven in der Administration. Ich konnte nicht genau
> feststellen, welches die Dateigrösse ist ab der die Datei korrumpiert
> ausgeliefert wird, ungefähr ab 12MB.
Es mag Zufall sein, aber der von Ihnen beschriebene Fehler ist uns heute
auch aufgefallen (siehe Ticket OPUSVIER-1928). Einen Zusammenhang mit
der Dateigröße konnten wir zwar nicht feststellen (wir können den Fehler
z.B. bei einer 7 MB großen Datei reproduzieren; eine 8 MB große Datei
konnten wir aber wieder problemlos herunterladen), aber die von Ihnen
beschriebene Fehlermeldung "Cannot send headers; headers already sent"
haben wir schon an anderer Stelle bemerkt und nie wirklich reproduzieren
können (siehe dazu Ticket OPUSVIER-1806).
> Meine Recherche ergab dass ähnliche Probleme öfters bei
> PHP-Downloadskripts auftreten, der Fehler entsteht meist wenn whitespace
> oder php notices u.ä. am Anfang oder Ende der Datei mit ausgegeben wird.
> In unserem Fall kann man mit einem Vergleich einer Original-pdf mit der
> beschädigten Version sehen dass am Ende des pdf ein String "Cannot send
> headers; headers already sent in
> /data/opus4/opus4/library/Controller/Helper/SendFile.php, line 146" steht.
>
> Das Phänomen liess sich beseitigen indem man in
> $OPUSHOME/opus4/library/Controller/Helper/SendFile.php nach dem Senden
> der Datei ein "exit;" einfügt, welches anscheinend erfolgreich
> verhindert dass irgendwelche weiteren Daten an die Datei angehängt werden.
>
> Zeile
> 146 $retval = fpassthru($fp);
> 147 if ($retval === false) {
> 148 throw new Exception('fpassthru failed.');
> 149 }
> 150 exit;
>
> Ich weiss nicht ob wir einen besonders langsamen Server, oder besonders
> grosse Dateien haben, so dass dieser Fehler noch nie bei jemand anders
> aufgetreten ist? Könnte natürlich auch eine ungünstige php.ini sein oder
> ähnliches... für Rückmeldungen wäre ich dankbar.
Ich habe Ihren Bugfix testweise eingebaut. Auch bei uns löst er das
Problem, dass beim Download von Dateien vereinzelt einige Bytes am Ende
verloren gehen. Wir werden Ihren Bugfix mit dem nächsten Release (OPUS
4.2), das im Dezember erstellt wird, offiziell veröffentlichen. Ich
bedanke mich nochmals sehr für das tiefe Eintauchen in den Code und das
prompte Bereitstellen einer Lösung!
Beste Grüße,
Sascha Szott
--
Sascha Szott :: KOBV/ZIB :: <szott at zib.de> :: +49 30 84185-457