Downloadscript
Johann
- php
Hallo,
ich habe vor ein paar Tagen schonmal wegen einem Downloadscript um Hilfe gebeten. Es ging um ein paar Verständnisfragen.
Eigentlich dachte ich das ich es gerafft habe, aber leider will es nicht funktionieren.
Also gegeben sei der Fall das die Dateien zum Download folgende Pfadangaben haben: /ordner/download/
Das Download-Script hat den Namen download.php und den Pfad /ordner
Aufruf für den Download von Datei_1.zip ist
download.php?download=2881
Es wird zwar der Download-Dialog vom Browser aufgemacht, und speichern kann ich auch, aber leider wird nur eine 1 kb große Datei mit dem Namen der Datei gespeichert.
Frage 1: Was ist an diesem Quellcode falsch ?
<?
$download = $_GET['download'];
$basedir = "/ordner";
$filelist = array(
"2881" => "download/Datei_1.zip",
"2882" => "download/Datei_2.zip",
"2883" => "download/Datei_3.zip",
"2884" => "download/Datei_4.zip"
);
if (!isset($filelist[$download]))
die("Datei $download ist nicht vorhanden.");
$filename = sprintf("%s/%s", $basedir, $filelist[$download]);
header("Content-Type: application/zip");
$save_as_name = basename($filelist[$download]);
header("Content-Disposition: attachment; filename="$save_as_name"");
readfile($filename);
?>
Frage 2:
Eigenlich wollte ich es so haben wie bei der Seite
http://www.winload.de/
Dort klickt man auf download, dann öffnet sich ein Fenster wo man den Speicherort auswählen kann und gut.
Beim Internet Explorer klappt es mit meinem Script genauso, aber beim Mozilla erkennt der Browser das Dateiformat nicht und muß mich vorher nochmal fragen was ich damit machen will, also speichern oder mit bestimmten Programm öffnen. Woran kann das liegen ? Ich habe es auch schon mit header("Content-Type: application/octet-stream"); ausprobiert.
Da passiert dasselbe.
An meinem Mozilla kann der Fehler nicht liegen, weil *.zip Dateien von http://www.winload.de/ auch erkannt werden.
mfg
Johann
Hi,
Es wird zwar der Download-Dialog vom Browser aufgemacht, und speichern kann ich auch, aber leider wird nur eine 1 kb große Datei mit dem Namen der Datei gespeichert.
die da was beinhaltet?
An meinem Mozilla kann der Fehler nicht liegen, weil *.zip Dateien von http://www.winload.de/ auch erkannt werden.
Untersuche den Unterschied der Rückgaben der beiden Mechanismen. Beachte insbesondere die Header.
Cheatah
Hallo,
die da was beinhaltet?
es wird die datei Datei_1.zip abgespeichert und wenn ich sie öffnen will bekomme ich Fehler. Der Typ der Datei ist *.zip und es wird auch dem richtigen Programm bei mir zugeordnet, in diesem Fall WinRAR.
Untersuche den Unterschied der Rückgaben der beiden Mechanismen. Beachte insbesondere die Header.
Du meinst application/octetstream oder application/zip ?
Wie kann ich das denn bei winload feststellen, da kommt ja nur der Speicherdialog.
mfg
Johann
Hi,
es wird die datei Datei_1.zip abgespeichert und wenn ich sie öffnen will bekomme ich Fehler. Der Typ der Datei ist *.zip und es wird auch dem richtigen Programm bei mir zugeordnet, in diesem Fall WinRAR.
gsss. Dann öffne sie mal mit 'nem Texteditor.
Untersuche den Unterschied der Rückgaben der beiden Mechanismen. Beachte insbesondere die Header.
Du meinst application/octetstream oder application/zip ?
application/octet-stream. Ich beziehe mich vor allem auf die Gesamtheit aller versendeten Header - augenscheinlich gibt es irgendwo einen Unterschied.
Wie kann ich das denn bei winload feststellen, da kommt ja nur der Speicherdialog.
Bau Dir einen Client, der die Header ausgibt, wenn Du noch keinen solchen hast.
Cheatah
Hi,
gsss. Dann öffne sie mal mit 'nem Texteditor.
<br />
<b>Warning</b>: readfile() [<a href='http://www.php.net/function.readfile'>function.readfile</a>]: open_basedir restriction in effect. File(/ordner/Director_1.zip) is not within the allowed path(s): (/Pfad zu meinem account/) in <b>Pfad zu download.php</b> on line <b>24 </b><br />
<br />
<b>Warning</b>: readfile(/ordner/Director_1.zip) [<a href='http://www.php.net/function.readfile'>function.readfile</a>]: failed to create stream: Operation not permitted in <b>Pfad zu download.php</b> on line <b>24</b><br />
hm was heißt das im Klartext ?
is not within the allowed path(s) ?
mfg
Johann
Hi,
hm was heißt das im Klartext ?
dass die Sicherheitseinstellungen Deines Servers für Deinen Bedarf zu hoch sind. Wende Dich an den Adminsitrator des Servers.
Cheatah
Hallo,
habe gerade mit einem Technker gechattet, der meint eine Pfadangabe scheint nicht zu stimmen.
Aber genaueres konnte er im chat auch nicht sagen er meint ich soll ne mail schreiben.
SIeht irgendwer da eine falsche Pfadangabe?
mfg
Johann
Hi,
SIeht irgendwer da eine falsche Pfadangabe?
ich weiß ja nicht, was für Dich falsch ist. Hat das Root-Verzeichnis der Festplatte(!) ein Verzeichnis namens "ordner"?
Cheatah
Hallo,
...der Festplatte ?
Ich dachte basedir is mein DocumentRoot auf dem Server ?
mfg
Johann
Hallo,
na supi jetzt gehts, habe wohl eine falsche Pfadangabe gemacht.
Download funktioniert jetzt, leider kann mozilla immer noch nicht das Dateiformat direkt erkennen. Außerdem ist mir aufgefallen das die gesamte Größe der Downloads in meinem Mozilla Downloadmanager und bei dem von Opera nicht zu sehen sind.
Also z.B. 320kb of ??kb steht da.
mfg
Johann
Hallo Johann,
Download funktioniert jetzt, leider kann mozilla immer noch nicht das Dateiformat direkt erkennen.
Wenn Du die Datei mit welchem Content-Type auslieferst?
Außerdem ist mir aufgefallen das die gesamte Größe der Downloads in meinem Mozilla Downloadmanager und bei dem von Opera nicht zu sehen sind.
Also z.B. 320kb of ??kb steht da.
Du müsstest noch einen Header namens Content-Length mitschicken. Dieser Header enthält die Größe der Datei in Bytes. Die bekommst Du über filesize() heraus.
Viele Grüße,
Christian
Hallo
Wenn Du die Datei mit welchem Content-Type auslieferst?
sowohl mit application/zip als auch mit application/octet-stream
geht es nicht.
Du müsstest noch einen Header namens Content-Length mitschicken. Dieser Header enthält die Größe der Datei in Bytes. Die bekommst Du über filesize() heraus.
Das klappt super, danke.
mfg
Johann
Hallo Johann,
[Mozilla Dateiformat erkennen]
sowohl mit application/zip als auch mit application/octet-stream
geht es nicht.
Wenn Du eine Hilfsanwendung für application/zip eingestellt hast, dann funktioniert das eigentlich, andernfalls natürlich nicht.
Viele Grüße,
Christian
Hi,
Wenn Du eine Hilfsanwendung für application/zip eingestellt hast, dann funktioniert das eigentlich, andernfalls natürlich nicht.
Eine Hilfsanwendung? Was meinst du damit ?
Octet-stream sollte doch eigentlich funktionieren.
Dialogbox von Mozilla sagt:
The File:"xxx.zip" is of type application/octet-stream,
and Mozilla does not know how to handle this file type. This
file is located at:
http://xxx/xxx
und dann das normale soll ich es mit einer Anwendung öffnen oder soll ich das File Speichern.
Seltsam seltsam.
mfg
Johann
Hallo Johann,
Eine Hilfsanwendung? Was meinst du damit ?
Bearbeiten -> Einstellungen -> Navigator -> Hilfsanwendungen
Octet-stream sollte doch eigentlich funktionieren.
Tut es doch auch:
Dialogbox von Mozilla sagt:
The File:"xxx.zip" is of type application/octet-stream,
and Mozilla does not know how to handle this file type. This
file is located at:
http://xxx/xxxund dann das normale soll ich es mit einer Anwendung öffnen oder soll ich das File Speichern.
Ja und? Wo ist das Problem dabei? Du octet-stream heißt ja nichts anderes als eine folge von "octets", was in diesem Kontext als "Bytes" zu interpretieren ist. octet-stream kann also _alles_ sein. ZIP, BMP, EXE(PE), ELF-Binärdatei, etc. Klar, dass Mozilla sich weigert, eine Default-Aktion durchzuführen, außer Du stellst sie an oben genannter Stelle explizit ein.
Viele Grüße,
Christian
Hiho
Zu 1)
Kann es sein das readfile() eine Datei nicht direkt ausgibt? Probier mal statt readfile($filename) folgendes:
$read = fopen($filename, 'r');
fpassthru($read);
Grüsse
Hallo
Zu 1)
Kann es sein das readfile() eine Datei nicht direkt ausgibt? Probier mal statt readfile($filename) folgendes:$read = fopen($filename, 'r');
fpassthru($read);
Hat leider auch nicht geklappt.
mfg
Johann
Habe deine anderen Beiträge nicht gelesen... aber da ich schon mal ein ähnliches Problem hatte hier zwei Ideen:
hat bei mir funktioniert...
Gruss Michael
Hi,
- application/octetstream (ohne -)
dieser MIME-Type ist nicht registriert und damit, zumal er kein "x-" zu Beginn des Untertyps enthält, ungültig.
- php-script ohne .php benennen und dann mit htaccess ForceType machen, damit es trotzdem ausgeführt wird..
Boah. Du spekulierst auf Browser-Bugs. Das Problem ist: Speichern können sie eigentlich alle.
Cheatah
Hallo
dieser MIME-Type ist nicht registriert und damit, zumal er kein "x-" zu Beginn des Untertyps enthält, ungültig.
und gerade deshalb funktioniert er so gut - unbekannt => download
Boah. Du spekulierst auf Browser-Bugs. Das Problem ist: Speichern können sie eigentlich alle.
hatte (soweit ich mich erinnern mag) bei netscape 6.x und 7.x das Problem, dass er die Dateien immer name.endung.php nennen wollte..
mfg
Michael
Hallo Michael,
dieser MIME-Type ist nicht registriert und damit, zumal er kein "x-" zu Beginn des Untertyps enthält, ungültig.
und gerade deshalb funktioniert er so gut - unbekannt => download
Wenn du einen unbekannten Dateityp angeben willst, um den IE auszutricksen, dann greife *BITTE* auf application/x-irgendwas, also z.B. application/x-web-download oder auch application/x-octetstream oder sonstwas, was Du willst, zurück. Aber application/octetstream ist nicht nur _unbekannt_, sondern zusätzlich _ungültig_.
Viele Grüße,
Christian
Hallo Christian,
Wenn du einen unbekannten Dateityp angeben willst, um den IE auszutricksen, dann greife *BITTE* auf application/x-irgendwas, also z.B. application/x-web-download oder auch application/x-octetstream oder sonstwas, was Du willst, zurück. Aber application/octetstream ist nicht nur _unbekannt_, sondern zusätzlich _ungültig_.
Es geht zwar um alles andere, als den IE (der machts mit application/x-msdownload perfekt...), aber natürlich hast du recht... ist mit x- wohl sauberer und funktioniert auch! Thx!
mfg
Michael
Hi,
- application/octetstream (ohne -)
- php-script ohne .php benennen und dann mit htaccess ForceType machen, damit es trotzdem ausgeführt wird..
...bei mir ergibt es dieselben Fehler, leider.
mfg
Johann