[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