Probleme mit Download-Script
Andreas
- php
Hallo, folgendes Download-Script:
function download_file() {
global $mkportals, $DB, $mklib, $mklib_board;
$file= $mkportals->input['file'];
$ide= $mkportals->input['ide'];
$query = $DB->query( "SELECT downloads FROM mkp_download where id = '$ide'");
$row = $DB->fetch_row($query);
$downloads = $row['downloads'];
++$downloads;
$DB->query("UPDATE mkp_download SET downloads ='$downloads' where id = '$ide'");
$DB->close_db();
$real_file = "mkportal/modules/downloads/file/mk_".$ide."_".$file;
$real_file = preg_replace("(.\*)\..\*
", "\1", $real_file);
$real_file .= ".mk";
if (is_file("mkportal/modules/downloads/file/".$file)) {
rename("mkportal/modules/downloads/file/".$file, $real_file);
}
@header( "Content-Type: application/octet-stream\nContent-Disposition: inline; filename="".$file.""\nContent-Length: ".(string)(filesize( $real_file ) ) );
$fh = fopen( $real_file, 'rb' );
fpassthru( $fh );
@fclose( $fh );
exit();
}
Das Problem ist nun dass wenn die Datei die heruntergeladen werden soll z.B. eine .txt Datei ist, das sie nicht gespeichert wird sondern der Inhalt der .txt-Datei angezeigt wird.
Ich habe versucht den header zu ändern ohne Erfolg.
Wie muss es lauten damit auch text-Dateien heruntergeladen werden können.
Das Seltsame ist im Firefox funktioniert das Script problemlos.
Nur im Internetexplorer (6.0.2900.xxx SP2) funktioniert es nicht.
Gruß Andreas
Ich bin mir jetzt nicht zu 100% sicher, aber ich denke als "Webmaster" kann man das nicht beeinflussen, genau so wenig wie man beeinflussen kann, dass der IE .doc-Dateien intern in einem MS-Word-Fenster öffnet.
Das ist meines Erachtens nach eine clientseitige Story.
Korrigiert mich wenn ich falsch liege
lg Gerhard
Ich bin mir jetzt nicht zu 100% sicher, aber ich denke als "Webmaster" kann man das nicht beeinflussen, genau so wenig wie man beeinflussen kann, dass der IE .doc-Dateien intern in einem MS-Word-Fenster öffnet.
Das ist meines Erachtens nach eine clientseitige Story.
Korrigiert mich wenn ich falsch liege
lg Gerhard
Hallo,
Gerhard hat ziemlich recht, d.h. das wenn ein TXT oder z.B. DOC oder EXL-File gesendet wird, wird der liebe IE erst versuchen, die Datei direkt darzustellen. Wir haben einmal für ein Projekt das gleiche Problem gehabt und nur über den Umweg der Kompremierung (d.h. wir wandeln serverseitig das File in ein ZIP um) gelösst.
Gruss
Georg
Hallo,
aber es geht doch irgendwie.
Wenn ich im Forum das von SMF ist ein txt-upload mache kann ich es auch mit dem IE als txt-File herunterladen.
Andreas
Hallo,
aber es geht doch irgendwie.
Wenn ich im Forum das von SMF ist ein txt-upload mache kann ich es auch mit dem IE als txt-File herunterladen.Andreas
Hallo,
der einzige Weg ist der einen "verhunzten" Header zu senden, nur das ist nicht wirklich empfehlenswert, da weder konform noch Browserübergreifend.
Gruss
Georg
Hi,
der einzige Weg ist der einen "verhunzten" Header zu senden, nur das ist nicht wirklich empfehlenswert, da weder konform noch Browserübergreifend.
Gibt es denn einen Browser, mit dem mein Listing nicht funktioniert?
Gruß, Cybaer
Hallo,
danke für eure Antworten.
@Cybaer: danke für den Header, werde ihn heute Abend noch testen und Bescheid geben.
Andreas
Hi,
Hallo, folgendes Download-Script:
Ich mal folgendes geschrieben:
header('Content-Transfer-Encoding: none');
header('Content-type: application/x-download');
header('Content-Disposition: attachment; filename='.basename($serverFile).';');
header('Accept-Ranges: bytes');
header('Content-length: '.filesize($serverFile));
readfile($serverFile);
Und das klappt auch auf dem IE mit .txt-Dateien.
Gruß, Cybaer
Hallo,
der Header hat klasse funktioniert, vielen Dank fafür.
Musste nur readfile($serverFile); weglassen und fertig.
Gruß Andreas
Ahoi Cybaer,
header('Content-Transfer-Encoding: none');
was macht das? find hier nix zu
http://de2.php.net/manual/de/function.header.php
header('Accept-Ranges: bytes');
was macht das?
header('Content-length: '.filesize($serverFile));
wie ermittle ich die dateigröße einer nichtvorhandenen datei? also die
datei liegt nicht auf dem server sondern wird dynamisch in einen
string geschrieben.
readfile($serverFile);
stattdessen hab ich dann echo.
MfG
\ / \ /´¯.l.¯
\ /Hi,
header('Content-Transfer-Encoding: none');
was macht das? find hier nix zu
Fauler Sack! >:->
535.000 Google-Einträge zu "Content-Transfer-Encoding none".
header('Accept-Ranges: bytes');
was macht das?
77.900 Einträge zu "Accept-Ranges: bytes"
header('Content-length: '.filesize($serverFile));
wie ermittle ich die dateigröße einer nichtvorhandenen datei? also die
datei liegt nicht auf dem server sondern wird dynamisch in einen
string geschrieben.
Und der hat welche Länge? Die man mit welchem Befehl ermittelt? (Google: "PHP Stringlänge ermitteln -inurl:.php", 158 Einträge)
Erinnert mich an "Die Feuerzangenbowle" ("Watt is' 'en Dampfmaschin'?" und "Aber jäder nor ein wänziges Schlöckchen!"). =;-)
Gruß, Cy-"wer richtig suchet, der auch findet"-baer
Erinnert mich an "Die Feuerzangenbowle" ("Watt is' 'en Dampfmaschin'?" und "Aber jäder nor ein wänziges Schlöckchen!"). =;-)
Oder noch besser: "Romanes eunt domus" 8->
Gruß, Cy-"das schreibst Du jetzt hundertmal"-baer
Hi,
Oder noch besser: "Romanes eunt domus" 8->
Halt, damit wird Ch. Schnauß bestimmt nichts anfangen können ... =;-)
Gruß, Cy-"wieder eklatante Bildungslücke gefunden?"-baer ;-)
Ahoi Cybaer,
Fauler Sack! >:->
ja, manchmal lehn ich mich zu gerne zurück und frag einfach, frei nach
dem motto "Wer wie was.. wer nicht fragt bleibt dumm." Hab ich in
meiner Jugend sehr häufig gehört.
Und der hat welche Länge? Die man mit welchem Befehl ermittelt? (Google: "PHP Stringlänge ermitteln -inurl:.php", 158 Einträge)
filsize Gibt die Größe einer Datei in Bytes zurück
strlen Gibt die Länge der Zeichenkette zurück.
größe in bytes === länge der zeichenkette?
Erinnert mich an "Die Feuerzangenbowle" ("Watt is' 'en Dampfmaschin'?" und "Aber jäder nor ein wänziges Schlöckchen!"). =;-)
naja, "Wenn der Vater mit dem Sohne" war besser.
MfG
\ / \ /´¯.l.¯
\ /Hi,
ja, manchmal lehn ich mich zu gerne zurück und frag einfach, frei nach
dem motto "Wer wie was.. wer nicht fragt bleibt dumm." Hab ich in
meiner Jugend sehr häufig gehört.
Ja, damals gab es aber auch Google noch nicht! =8->
filsize Gibt die Größe einer Datei in Bytes zurück
strlen Gibt die Länge der Zeichenkette zurück.
größe in bytes === länge der zeichenkette?
Machst Du hier einen auf Realsatire? =;->
naja, "Wenn der Vater mit dem Sohne" war besser.
Pfh! >:-)
Gruß, Cybaer
Ahoi Cybaer,
Ja, damals gab es aber auch Google noch nicht! =8->
AFAIK geht der text aber noch nicht "wer nicht googelt der bleibt dumm"
filsize Gibt die Größe einer Datei in Bytes zurück
strlen Gibt die Länge der Zeichenkette zurück.
größe in bytes === länge der zeichenkette?
Machst Du hier einen auf Realsatire? =;->
nein die frage war ernst gemeint. nach einem test ergab strlen 1188
abgespeichert und eigenschaft angekuckt stand da 1192. kurze
überlegung dann zum ergebniss gekommen, die 1188 standen ja noch nicht
drinsind 4 zeichen. was mich aber verwirrt ist dies hier (WinXP)
Größe auf datenträger 4,00 KB (4.096 Bytes)
wie kommt denn das zustanden? und was wäre jetzt die korekte angabe zu senden?
naja, "Wenn der Vater mit dem Sohne" war besser.
Pfh! >:-)
wie hieß den gleich nochmal der schauspieler? Heinz Rühmann?
leider ist er schon tot :(
MfG
\ / \ /´¯.l.¯
\ /Ahoi Daniel,
nein die frage war ernst gemeint.
ansich besteht ein zeichen ja aus 8bit, und 8bit sind 1byte. allerdings
hab ich mal was von start-, stop- und kontrollbits was gehört.
MfG
\ / \ /´¯.l.¯
\ /Hi,
ansich besteht ein zeichen ja aus 8bit,
Meistens schon. Wenn nicht, dann greifen in PHP andere Befehle.
und 8bit sind 1byte. allerdings
hab ich mal was von start-, stop- und kontrollbits was gehört.
Im Zusammenhang mit Modems wahrscheinlich.
Gruß, Cybaer
Hi,
Größe auf datenträger 4,00 KB (4.096 Bytes)
Bei dem Dateisystem (FS) der gespeicherten Datei die Größe einer Zuordnungseinheit.
Die unterscheidet sich von FS zu FS und ist durchaus interessant und wichtig, für die Verarbeitung der Datei jedoch nicht.
wie kommt denn das zustanden? und was wäre jetzt die korekte angabe zu senden?
Die Dateilänge, also filesize() - oder eben strlen().
wie hieß den gleich nochmal der schauspieler? Heinz Rühmann?
leider ist er schon tot :(
Alt ist er geworden ... :-)
Gruß, Cybaer
Ahoi Andreas,
ich bin gerade etwas am experimentieren und habe hier, diesen "codeschnipsel" gefunden:
if(isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'],'MSIE'))
header('Content-Type: application/force-download');
else
header('Content-Type: application/octet-stream');
was macht das? ist das hilfreich?
MfG
Hi,
if(isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'],'MSIE'))
Wenn im UA "MSIE" vorkommt ...
header('Content-Type: application/force-download');
... verwende einen erfundenen Content-Type (veranlaßt den IE zum "Speichern unter").
else
header('Content-Type: application/octet-stream');
Sonst verwende den offiziellen CT für Binaerstreams (sollte bei "normalen" Browsern das "Speichern unter" veranlassen).
was macht das? ist das hilfreich?
Wie man's nimmt. Der Inhalt des UAs ist beliebig (auch beim IE) und jeder Browser bietet bei einen ihm unbekannten CT (üblicher- & logischerweise) an, ihn ggf. zu speichern. Ergo: Ich halte dieses Vorgehen für sinnlos bis fehleranfällig.
Georg, der scheinbar die Befürchtung hat, daß Browser mit unbekannten Streams anders verfahren (oder aus Prinzip keine unbekannten CTs verwenden möchte), mag dies anders sehen. ;-)
Gruß, Cybaer