PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : HTML/PHP: Download eines Datenblocks: Leerzeichen erscheint



Jaecko
10.10.2011, 11:33
Moin.

In einem Projekt sollen von einem Server Dateien herunterladbar sein. Problem: Der Ordner für die Dateien liegt "ausserhalb" des Document Root, also per http nicht zugreifbar.
"Theoretisch" könnte man diese über file:// holen. Da aber die meisten Browser es nicht zulassen, file:// von http(s):// aus aufzurufen, hab ich eine andere Möglichkeit verwendet. (Den Link von Hand kopieren und in ein Browserfenster eingeben funktioniert zwar, ist aber zu aufwendig und für den ein odere anderen DAU ein Problem).

Mit fopen kann ich problemlos auf die Dateien zugreifen und den Inhalt mit fread holen. Über einen Download-Header veranlass ich im Browser dann den Download des Datenblocks.

Vereinfacht und mal ohne Prüfungen auf Dateiexistenz etc.:


$_fileWithPath = $_GET['file'];
$filehandle = fopen($_fileWithPath, "r");
$stream = fread($filehandle, filesize($_fileWithPath));
fclose($filehandle);
header("Content-type: application/force-download");
header("Content-Disposition: filename=$_filename");
header("Content-Description: Downloaded File");
echo "$stream";


Das funktioniert soweit auch, nur dass in der heruntergeladenen Datei dann ein Leerzeichen (0x20) an erster Stelle ist, das in $stream definitiv nicht drin ist.
Ersetz ich das nämlich z.B. durch echo "ABC" steht in der Datei dann " ABC".
Weiss jemand, wo dieses Leerzeichen herkommt bzw. wie man das loswird?

mfG

BMS
10.10.2011, 15:13
Hallo Jaecko,
das könnte u.U. mit dem verwendeten Zeichensatz zusammenhängen.
Manche Dateien beginnen dann mit 
Einfach mal mit einem Hex-Editor ansehen.
Notfalls irgendwie mit substr oder trim arbeiten o.ä.
Grüße, Bernhard

Jaecko
10.10.2011, 15:31
Naja die Idee mit trim etc. hätt ich schon mal gehabt. In der Datei passts soweit auch.
Mit trim komm ich da aber nicht weiter, da ja die Variable in der echo-Anweisung noch passt. Das Leerzeichen kommt danach erst irgendwo rein, wo mir trim/substr & co. nix mehr helfen. Wie schon gesagt, wenn ich echo "ABC" schreib, kommt eine Datei mit " ABC" raus.

BMS
10.10.2011, 15:43
Bei echo "$stream"; kannst du die Anführungszeichen weglassen, dürfte aber eigentlich nix ändern.
Hast du noch mehr Code? Vielleicht liegt der Fehler an einer anderen Stelle?
Oder muss man den Zeichensatz über header() auch irgendwie einstellen?
Versuche auch mal eine andere Zeichenkodierung im Browser (Firefox: Webentwickler->Zeichenkodierung).
Meist wird UTF8 oder ISO 8859 Westlich verwendet.
Schon was mit dem Hex Editor rausgekriegt?
Da könnte bereits vor dem <?php etwas drinstehen, dass dann als HTML interpretiert sofort dargestellt wird.

Jaecko
10.10.2011, 16:10
Mehr Code solls später schon mal sein, nur isses bei dieser Minimalanwendung auch schon.
direkt davor und danach kommen noch <?php und ?>

Leerzeichen davor hab ich auch schon geprüft; bzw. hier meckert PHP sogar, wenn nach einer Ausgabe eines Zeichens nochmal Headerdaten gesendet werden (so von wegen "Cannot modify header information - headers already sent").
Zum Hex-Editor: die Dateien sind bis auf das Leerzeichen identisch. Also die heruntergeladene Datei ist genau 1 Byte länger; alle Datenbytes sind um 1 nach hinten gerutscht und das erste ist 0x20, quasi wie $x = " " + $x; stimmt auch, dass echo mit und ohne "" nix ändert. Ebenso bringt print das gleiche Ergebnis.

Hab auch gerade mal mit nem Network Monitor auf den TCP-Verkehr geschaut, in der Hoffnung da rauszufinden, ob das Leerzeichen schon übertragen wird.
Da das ganze aber https ist, steht da (leider) nix im Klartext drin.

schokocappucino
10.10.2011, 21:13
Du kannst readfile($filename) nehmen, das erspart dir die dateioperationen und die Ausgabe per echo.

robocat
11.10.2011, 15:13
Inwiefern ist es htpps? Davon steht nichts in deinem Code. Könnte das die Ursache sein?

Ich habe deinen Code getestet, bei mir geht das ohne Probleme sowohl mit ASCII als auch Unicode oder UTF-8. Keine führenden Leerzeichen.

Gruesse