bufferm44
Goto Top

http und ftp download - bei http wird ISO-Datei kaputtgemacht durch Größenänderung

Hi zusammen,

ich habe ein großes Problem, in einer Firma können User von einer (internen) website DVD-Images herunterladen. Das ist wie folgt realisiert:

...
aus einer Datenbank auslesen welche ID (= Filename) das Image-File hat...
...
$dvdimage=sprintf("ftp://user:password@10.10.10.10/opt/data2/DVD/%s.ISO",$dbobject->id);  
printf("<a href=\"%s\" style=\"text-decoration: none;\" ><img src=DVD/dvd_download.gif border=0></a><br>\n",$dvdimage);  
...	

Das funktioniert auch einwandfrei, dummerweise kann man so durch den Link schön das Passwort des FTP-Servers sehen (im Browser unten links als Link).

Meine Idee war nun folgende:

Die Zeile 5 durch diese zu ersetzen:

printf("<a href=\"DVD/dvddownload.php?id=%s\" style=\"text-decoration: none;\" ><img src=DVD/dvd_download.gif border=0></a><br>\n",$dbobject->id);  

um eine weitere php-datei "dvddownload.php" aufzurufen. Die enthält:

<?
$file=$id.".ISO";  
$path="/opt/data2/DVD/".$id.".ISO";  

header('Content-type: application/$iso');  
header("Content-Disposition: attachment; filename=\"".$file."\";" );  

readfile($path);
?>

Das funktioniert auch.

Problem: Das runtergeladene ISO-File hat eine (um ein paar Bytes) abweichende Dateigröße, was für MAC-Benutzer bedeutet, dass das Image nicht mehr erkannt wird weil Größe/2048 nicht mehr glatt ist. Bei der ftp-Version besteht das Problem NICHT!

Ich vermute dass hier mein Problem erklärt wird:

http://www.apfeltalk.de/forum/iso-datei-erkannt-t127516.html

Wie erreiche ich nun per http-download dass die Größe der Datei nicht mehr verändert wird, jemand eine Idee?

PS neuen eingeschränkten ftp-user einrichten fällt aus, da liegen pro Ordner sehr viele files und großzügig markieren und runterladen soll vermieden werden, nur durch die Weboberfläche mit vorheriger Berechtigungsprüfung darf man runterladen...

Grüße

Tobi

Content-ID: 119708

Url: https://administrator.de/contentid/119708

Ausgedruckt am: 22.11.2024 um 05:11 Uhr

Supermax
Supermax 04.07.2009 um 08:48:39 Uhr
Goto Top
Sollte Zeile 5 nicht eher heißen
header('Content-type: application/iso');  
(also ohne das $ Zeichen)?

Ansonsten fällt mir als Fehlerursache nur ein daß die 32bit Versionen von PHP haben manchmal Probleme mit Dateien > 2GB (ich weiss ja nicht wie groß die ISOs sind) haben. Welcher Browser wird denn auf Mac-Clients zum Download verwendet?

Eventuell kann man sich mit einem geeigneten Tool die kompletten HTTP-Header ausgeben lassen und so dem Fehler auf die Schliche kommen.
bufferm44
bufferm44 04.07.2009 um 13:14:22 Uhr
Goto Top
Hi Supermax,

ja klar, ohne $, das ist wohl irgendwie beim Kopieren da mit reingerutscht...

Ich habe meinen Fehler mittlerweile gefunden, ich habe gestern anscheinend den Wald vor lauter Bäumen nicht mehr gesehen, nachdem ich irgendwann im Laufe des Tages die "header("Content-Length: $laenge");" Angabe getestet hatte, sie aber anscheinend keinen Wert zurück gab (Pfad falsch? Keine Ahnung), hatte ich diese Zeile wieder auskommentiert. Bei funktionierender Zuweisung von $laenge und dem zurückkegebenem Wert scheinen die Dateigrößen nun nach dem Runterladen wieder exakt zu stimmen.

 
$file=$id.".ISO";  
$path= "/opt/data2/DVD/".$id.".ISO";  

$laenge = filesize($path) ;
header("Content-Type: application/force-download");   
header("Content-Length: $laenge");  // -----!!!!!------   
header("Content-Disposition: attachment; filename=\"".$file."\";" );  
readfile($path);

Hatte nur die Möglichkeit das an einem Mac via VPN und VNC zu testen aber dort lief es (habe nur VPN Secure Client für Windows). Zum Testen habe ich nur Images mit <200MB getestet, werd Montag mal ein großes testen...

Auf den Macs kommen übrigens Firefox und Safari zum Einsatz.

LG Tobias
bufferm44
bufferm44 09.07.2009 um 17:32:25 Uhr
Goto Top
Hm,

bei den meisten Files klappt es jetzt, eben habe ich eins gehabt das war auf dem Server:

2.225.936.384 Byte

und nach dem Download

2.225.936.387 Byte

3 Bytes !!! Wo kommen die nur her? face-sad

Tobias
Supermax
Supermax 09.07.2009 um 17:44:03 Uhr
Goto Top
Kann es sein daß du dein Script manchmal mit einem Editor abspeicherst, der bei UTF8-codierten Dateien den sogenannten "Byte Order Marker" schreibt? Das sind genau 3 Bytes, und unter Umständen werden diese dann vom Webserver mit ausgegeben, einige Browser können dies ignorieren, andere schreiben brav alles was vom Server herausgeschickt wird.

Besorge dir am besten mal ein Tool wie z.B. "Fiddler", damit kannst du genau sehen was zwischen Client (Browser) und Server hin und her geschickt wird.

Um ganz sicher zu gehen, solltest du nach dem readfile() direkt ein flush() und exit(); in dein Script schreiben, sonst kann es sein daß ein paar Leerzeilen nach dem schließendenen ?> in deinem Script ebenfalls noch ausgegeben werden.
bufferm44
bufferm44 10.07.2009 um 02:04:45 Uhr
Goto Top
Also $leerzeilen= true, sogar 4 Stück, schäm...

das mit dem flush und exit probiere ich morgen mal,

ich benutze PSPad und der Byte Order Marker ist aus, ich denke mal das ist der Punkt "Ident.Bytes bei UTF-8", kein Haken gesetzt...

Tobias
bufferm44
bufferm44 13.07.2009 um 21:23:22 Uhr
Goto Top
So, das scheint zu laufen, vielen Dank für die guten Tipps. Hast Du noch einen Tipp, warum die zu downloadende Datei NUR BEIM MAC beim runterladen mit "Größe unbekannt" läuft bis sie fertig runtergeladen wurde? Beim PC wird die Größe korrekt ausgegeben die Prozenzanzeige läuft astrein...

LG
Tobias