PHP Upload - Download 30 bytes werden abgeschnitten/hinzugefügt

lordg2009

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.559
Ich habe ein merkqürdiges Problem,

ich habe eine Seite, in der es möglich ist, Dokumente hochzuladen und anschließend wieder herunterzuladen. Das war auch immer kein Problem. Jetzt habe ich die Seite auf einen webspace geladen und die Dateien lassen sich nach dem Download nicht mehr öffnen, obwohl die Größe absolut identisch ist, mit denen der Originaldateien.

Ich habe die Dateien also im HexEditor angeschaut und folgendes festgestellt:
Die letzten 30 Bytes der Datei werden entfernt, dafür werden die ersten 30 Bytes mit 15 Zeilenumbrüchen ausgefüllt. Macht man diese Änderung rückgängig, lässt sich die Datei wieder öffnen.

Habt ihr eine Idee, woran das liegen kann?

Vielen Dank

PS: Ich habe die Datei gerade mit ftp vom server gezogen, da funktioniert sie ohne probleme, es muss also am download hängen
 
Wie sieht denn deine "Downloadfunktion" aus? vllt kannst du sie hier ja mal posten, sprich den Source
 
PHP:
function file_download($filename, $fileid, $dir = './../upload/')
	{
		// Dateiendung filtern
		$file_ending = explode('.', strrev($filename));
		$file_ending = 'application/' . strrev($file_ending[0]);
		
		header('Content-Description: File Transfer');
		header('Content-Type: ' . $file_ending);
		header('Content-Disposition: attachment; filename=' . $filename);
		header('Content-Transfer-Encoding: binary');
		header('Expires: 0');
		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
		header('Pragma: public');
		header('Content-Length: ' . filesize($dir . $fileid));
		ob_clean();
		flush();
		readfile($dir . $fileid);
		
		return 0;
	} else {
		return 1;
	}
Ergänzung ()

Wer sich wundert, die Dateien werden unter einer ID gespeichert und der Name wird in einer Datenbank gespeichert. Beim Download werden sie wieder zusammengefügt.
Ergänzung ()

Noch eine Merkwürdigkeit:

Auf der einen Seite funktionieren die Dateien, wenn ich sie direkt per ftp vom Server hole, nicht aber über die Downloadfunktion.
Das spricht ja für ein Problem der Downloadfunktion.

Auf der anderen Seite kann man noch alle Dateien runterladen, die vor dem Umzug erstellt wurden und die ich per ftp hochgeladen habe.
Das wiederum spricht für ein Problem mit der Uploadfunktion.
Ergänzung ()

Ne sry, schon wieder ne Ergänzung:
Die anderen Dateien weisen diesen Fehler ebenfalls nach download auf, nur dass sie sich trotzdem öffnen ließen, es muss also definitiv an der Downloadfunktion liegen. Sie alle sind unverändert bei einem Download über ftp.
Ergänzung ()

Es hängt irgendwie mit dem buffer zusammen. Wenn ich den buffer mit flush nicht leere, dann klappte es, meine aktuele apache-ausgabe wird aber an die Datei angehängt.
 
Ich gehe mal davon aus, dass du die Original Dateien noch hast.
Meine Idee wäre jetzt erstmal auf die schnelle alle Download Dokumente auf deiner Seite zu löschen und neu Hochladen.
Sollte dies immer noch bestehen, würde ich als nächstes das Download Plugin falls eins benutzt wird deinstallieren und ebenso neu installieren und nochmals die Original Dateien hinauf laden.
Meine Vermutung ist einfach das, wie du ja schreibst den Webspace gewechselt hast irgendwas nicht richtig übernommen wird.

Nachtrag, habe grade noch gelesen bei dir das auch etwas mit dem Upload wohl nicht stimmt!
Überträgst Du die Dateien auch Binär über FTP?
 
Waren ein paar viele Informationen, deshalb noch mal die Zusammenfassung

- normalerweise werden die Dateien über die Website hochgeladen
- ftp war nur für den Umzug (um vorhandene Dateien ohchzuladen)
- testweise über ftp heruntergeladene Dateien weisen keine Probleme auf
- Alle über die website heruntergeladene Dateien bekommen am Anfang der Datei 30 Bytes hinzugefügt (15 Zeilenumbrüche)
- Allen diesen Dateien werden die letzten 30 bytes abgeschnitten
- Manche sind dann noch benutzbar, andere nicht

Ich benutze 2 Funktionen um den Ausgabepuffer for 'readfile()' zu leeren.

1.) ob_clean();
2.) flush();

Lasse ich flush() weg, so wird eine Datei mit den zusätzlichen 30 Bytes am Anfang, dem kompletten Dateiinhalt und meiner restlichen Scriptausgabe (in dem Fall der Rest der html php-Ausgabe) erzeugt. Die Datei lässt sich dann öffnen.

Das Problem sind also die 30Bytes am Anfang und ich weiß nicht, wo die herkommen.
Ergänzung ()

Ich hab jetzt direkt nach dem readfile ein exit gesetzt und die flush() Funktion weggelassen. Trozdem sind noch die 15 Zeilenumbrüche am Anfang und ich hätte sie schon gerne weg da.
 
Der einfachste Weg ist hier wohl: Schnapp dir irgend ein Open Source CMS und nimm dessen Download-Funktionen, z.B. ne PDF-Rechnungsschnittstelle, auseinander.

Ansonsten: Check mal die Header. Dafür gibts ein paar Browser-Plugins. Ich bin mir sicher, dass da was nicht hin haut.
 
vielleicht liegt es auch nicht an deiner Seite sondern am Browser?
mal den Browser Cache komplett leeren, eventuell auch mal einen anderen Browser test halber nutzen.
sonst wüsste ich jetzt nicht mehr wo noch der Wurm liegen könnte.

 
Das waren ja schon open source funktionen, die ich auseinandergenommen habe. Mit den Headern kenne ich mich nicht wirklich aus.

Habs gerade mit firefox probiert, kein Unterschied, die 15 Zeileumbrüche sind da und firefox hat wirklich keine plugins installiert.

Ich werde es jetzt erst mal so lassen, auch wenns mich stört, merkt es ja doch keiner :(
 
ich habe den code auf das wesentliche reduziert, das else habe ich vergessen rauszunehmen, sry
Ergänzung ()

Ich habs, eine echt dähmliche Geschichte:

Ich habe eine php Datei mit all meinen Funktionen, die included wird.

Zum Programmieren nutze ich notepad++
notepad++ highlighted mir dir Syntax nur, wenn php code in <?php ?> steht.
Ich weiß nicht, ob man diesen php tag auch in Dateien hizufügen muss, die included wurden, da man ja eigentlich schon im php tag ist und da heraus einfach included!?
Ich beginne jedenfalls jede include Datei mit <?php ?>
Am Ede der Funktionsdatei waren (zum Scrollen) 15 Zeilenumbrüche nach dem ?>.
Diese wurden bereits ausgegeben und erschienen am Anfang der Datei.
Danke dem header
PHP:
header('Content-Length: ' . filesize($dir . $fileid));
wurden diese Zeichen auch schon mit zur Datei gezählt und der Datei-Stream entsprechend eher terminiert.
Somit hat bei den PDFs am Ende immer das EOF und noch ein paar Zeichen gefehlt.
-> Fehler

Ich habe alle Zeilenumbrüche gelöscht, jetzt geht es.

Danke euch
 
lordg2009 schrieb:
Am Ede der Funktionsdatei waren (zum Scrollen) 15 Zeilenumbrüche nach dem ?>.
Deshalb lerne bitte gleich jetzt: PHP-Dateien immer nur mit <?php beginnen und kein End-Tag irgendwo hinsetzen. Ein ?> ist vollkommen nutzlos, außer du bist direkt im Markup.
 
Zurück
Oben