Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
25.01.2007, 15:40
Heini



Folgendes Problem:

Ich will mittels PHP einen Download erzwingen, d.h. ich will nicht, dass wenn man z.B. eine *.txt - Datei zum Download stellt, diese im Browser geöffnet wird, sondern gesendet wird.

Das klappt soweit auch ganz gut, zumindest mit dem Firefoxbrowser, aber der IE öffnet die Datei ignorant im Browser.

Siehe:
Downloadscript

Weiß jemand, ob man das Problem umgehen kann oder ob man das Aktzeptieren muss?

PHP-Quellcode:<?php
//[...]

  
$cfg['pageurl'] = ('http://theiro.plastic.hl-users.com'); // URL vom Localhost
  
$link = ('http://theiro.plastic.hl-users.com/gzbeta/include/content/downs/files/test.txt'); //Fileurl

  
$type eregi_replace ($cfg['pageurl'].'(.*)''LOCALHOSTFILE'$link); 
  
$link eregi_replace ('http://'''$link);

  if (
$type != "LOCALHOSTFILE"//Wenn die Datei nicht auf eigenem Webspace liegt, dann...
   
{
    
header ("Location: http://".$link.""); //Einfache Weiterleitung
   
}

  else 
//Wenn Datei auf eigenem Webspace liegt, dann: Start Download erzwingen
   
{
    
$filename $link;
    
$filename "files/".basename($filename);

    
$filedata file_get_contents($filename);
    if (
strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') > 0)
     {
      
Header('Content-Type: application/force-download');
     }
    else
     {
      
Header('Content-Type: application/octet-stream');
     }

  
Header('Content-Length: ' strlen($filedata));
  
Header('Content-Disposition: inline; filename=' basename($filename));
  
Header('Expires: 0');
  
Header('Cache-Control: no-cache, no-store, must-revalidate');
  
Header('Pragma: no-cache');
  print 
$filedata;

  }

//[...]
?>

--

.


Dieser Beitrag wurde am 25.01.2007 um 15:52 von Heini bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
26.01.2007, 01:27
Sir_Prize



wozu? findest du nicht, dass der user selbst entscheiden können soll, ob er die textdatei (oder auch jede andere beliebige datei) nur kurz angucken will (im browser), oder ob er sie runterladen und speichern will? also mich würde so ein zwang nerven.

--

"Herr Keuner sagte: «Schwierig ist, diejenigen zu belehren, auf die man zornig ist. Es ist aber besonders nötig, denn sie brauchen es besonders.»" - Bertolt Brecht
-
"Hier gibt's was auf die Ohren" - Thewall.de bei last.fm (Was ist last.fm?)

zum Seitenanfang zum Seitenende Profil || Suche
002
26.01.2007, 12:50
Tomz



@heini
sorry, hab schon länger nicht mehr wirklich mit php gearbeitet... habs mir mal angesehen, aber kanns dir nicht so ausm stegreif sagen.

Zitat:
Sir_Prize postete
wozu? findest du nicht, dass der user selbst entscheiden können soll, ob er die textdatei (oder auch jede andere beliebige datei) nur kurz angucken will (im browser), oder ob er sie runterladen und speichern will? also mich würde so ein zwang nerven.
also mich würde so eine antwort nerven. er hat nicht gefragt ob es sinn macht, sondern wie es funktioniert. ich muss jetzt sagen dass ich mir gewisse anwendungen vorstellen kann, wo das auch nützlich sein kann...
wenn zum beispiel eine automatische weiterleitung auf einen download gemacht wird und man keinen link hat, auf dem man speichern unter machen könnte, würde zum beispiel ein mp3 bei mir direkt im browser geöffnet werden (vlc plugin) und ich könnte es gar nicht downloaden. und nur weil es dich nerven würde soll er es jetzt anderst machen?

--

...denn das atombrot wird nicht ruhen bis es den letzten erwischt hat...

zum Seitenanfang zum Seitenende Profil || Suche
003
26.01.2007, 12:57
Heini



Zitat:
Sir_Prize postete
wozu? findest du nicht, dass der user selbst entscheiden können soll, ob er die textdatei (oder auch jede andere beliebige datei) nur kurz angucken will (im browser), oder ob er sie runterladen und speichern will? also mich würde so ein zwang nerven.
Da sonst die direkte URL einsehbar ist.

Zum Problem: Ich habe in anderen Foren gelesen, dass es desöfteren Probleme von Browser zu Browser gibt. Scheinbar ist die technische Umsetzung nicht komplett fehlerfrei möglich.

Scheinbar ist die einzig sinnvolle Lösung, jede Datei als .zip zum Download zu stellen.

--

.

zum Seitenanfang zum Seitenende Profil || Suche
004
26.01.2007, 13:11
Adrian_Broher
Admin


Zitat:
Heini postete
Da sonst die direkte URL einsehbar ist.
Ich weiss zwar nicht was du für dlsoftware nutzt, aber ich kann bei meiner sehr wohl die url erkennen von wo ich eine datei downloade.

Ansonsten könntest du dich ja mit mod_rewrite vertraut machen, falls dir die Tatsache mit dem "User kann url sehen" zuwider ist.

http://www.modrewrite.de/

--

There is nothing wrong with high standards. It's your problem that you don't meet them.
If you think it's simple, then you have misunderstood the problem.
When a customer says "nothing has changed", assume they're lying.

zum Seitenanfang zum Seitenende Profil || Suche
005
26.01.2007, 14:50
theDon



Zitat:
Tomz postete
@heini
sorry, hab schon länger nicht mehr wirklich mit php gearbeitet... habs mir mal angesehen, aber kanns dir nicht so ausm stegreif sagen.
Also mich wuerde so eine Antwort nerven. Er hat nicht gefragt ob du es ihm aus dem Stegreif sagen kannst, sondern wie es funktioniert.

...

Es gibt keinen konformen Weg, einen User Agent zu zwingen, eine Datei herunterzuladen statt anzuzeigen (und das ist auch gut so).

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
006
26.01.2007, 15:33
rawe



ersetze
PHP-Quellcode:<?php
Header
('Content-Disposition: inline; filename=' basename($filename));
?>
durch
PHP-Quellcode:<?php
Header
('filename=' $filename);
?>
und entferne das
PHP-Quellcode:<?php
Header
('Cache-Control: no-cache, no-store, must-revalidate');
?>
funktioniert bei mir im IE und im Firefox ;)

es ist allerdings fies den User dazu zu zwingen die Datei erst auf die Festplatte zu speichern und diese dann von dort zu öffnen... gerade bei kleinen Dateien nervt die viele Klickerei.

--

O o
/¯¯/_o___o___o___o____o__
\__\¯¯o¯¯¯o¯¯¯¯¯¯o¯¯¯¯¯¯o
i'm doctoroctogonnafuckinggonnapus blaaaaaaaaaaargggggg-


Dieser Beitrag wurde am 26.01.2007 um 15:35 von rawe bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
26.01.2007, 16:17
Heini



Danke für jegliche Hilfe, ich bin jetzt ein gutes Stück weiter gekommen.

Um mich klarer auszudrücken bezüglig Download erzwingen: Das mit dem Download erzwingen ist nicht so gedacht, dass man die Datei UNBEDINGT mit "Speichern unter" runterladen muss, aber es muss mindestens ein "Öffnet mit" sein, ich will nämlich nicht, dass z.B. eine .txt Datei oder eine Sounddatei vom Browser aus gestartet wird.
(Hab das jetzt auch korrigert, dass man mit dem FF NUR "Datei Speichern" anwählen konnte, jetzt kann man sie auch (indirekt) öffnen. ("Öffnen mit...") )

Allerdings habe ich immer noch ein Problem: Der IE nimmt die Datei jetzt zwar an, aber gibt der Datei immer den Namen "downloader.php" (Name der PHP-Datei)
Der IE ignoriert also folgenede Zeile: PHP-Quellcode:<?php
Header
('filename=' basename($filename));
?>
Der FF ignoriert die Zeile zwar auch, aber für den FF habe ich dann folgende Zeile PHP-Quellcode:<?php
Header
('Content-Disposition: inline; filename=' basename($filename));
?>
beibehalten können, aber beim IE funktioniert dieser Header bekannterweise ja nicht.

Ich habe das Script auch Online geupdated: Downloadscript

Der neue PHP-Code sieht wie folgt aus:
PHP-Quellcode:<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') > 0//Header für IE
     
{
      
Header('Content-Type: application/force-download');
      
Header('Filename=' basename($filename)); //Diese Zeile wird ignoriert...
     
}
    else 
//Header für FF
     
{
      
Header('Content-Type: application/force-stream');
      
Header('Content-Disposition: Filename=' basename($filename)); //Diese Zeile klappt nur beim FF
     
}

  
Header('Content-Length: ' strlen($filedata));
  
Header('Expires: 0');
  
Header('Pragma: no-cache');
  print 
$filedata;
?>

--

.

zum Seitenanfang zum Seitenende Profil || Suche
008
26.01.2007, 22:51
theDon



Zitat:
Der IE ignoriert also folgenede Zeile:
PHP-Quellcode:<?php
Header
('filename=' basename($filename));
?>
Vollkommen zu recht, das ist kein gueltiger HTTP-Header.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
009
27.01.2007, 01:13
Sir_Prize



Zitat:
Tomz postete
Zitat:
Sir_Prize postete
wozu? findest du nicht, dass der user selbst entscheiden können soll, ob er die textdatei (oder auch jede andere beliebige datei) nur kurz angucken will (im browser), oder ob er sie runterladen und speichern will? also mich würde so ein zwang nerven.
also mich würde so eine antwort nerven. er hat nicht gefragt ob es sinn macht, sondern wie es funktioniert. ich muss jetzt sagen dass ich mir gewisse anwendungen vorstellen kann, wo das auch nützlich sein kann...
wenn zum beispiel eine automatische weiterleitung auf einen download gemacht wird und man keinen link hat, auf dem man speichern unter machen könnte, würde zum beispiel ein mp3 bei mir direkt im browser geöffnet werden (vlc plugin) und ich könnte es gar nicht downloaden. und nur weil es dich nerven würde soll er es jetzt anderst machen?
Zitat:
Heini postete:
Weiß jemand, ob man das Problem umgehen kann oder ob man das Aktzeptieren muss?
man kann das problem umgehen indem man das ganze benutzerfreundlich mit direktlink gestaltet. das ist doch ne lösung des problems! mehr war ja gar nicht gefragt. Gerade bei Webentwicklungen sollte vor allem Bneutzerfreundlichkeit im Vordergrund stehen. Ich finde man sollte, wenn man auf Probleme stößt, auch mal über den Tellerrand hinausschauen, ob es nicht vielleicht alternativen gibt, die eine bessere / benutzerfreundliche / sonstwie andere lösung ergeben. wenn jemand fragt wie er frames programmiert würde ich antworten das diese veraltet, unkomfortabel und suboptimal bzgl. suchmaschinen sind und auzeigen, wie man das ganze zB mit PHP und includes bauen kann. verstehst du worauf ich hinaus will?

@topic:
wer die url der datei haben will, wird sie auch auf irgendeine weise bekommen. (bringt natürlich nur was, wenn diese statisch ist). von daher kann man sich die ganze arbeit auch sparen und nen direktlink nehmen.

--

"Herr Keuner sagte: «Schwierig ist, diejenigen zu belehren, auf die man zornig ist. Es ist aber besonders nötig, denn sie brauchen es besonders.»" - Bertolt Brecht
-
"Hier gibt's was auf die Ohren" - Thewall.de bei last.fm (Was ist last.fm?)

zum Seitenanfang zum Seitenende Profil || Suche
010
27.01.2007, 12:38
Heini



Im ganzen hast du natürlich Recht... Ein Direktlink ist schon benutzerfreundlicher. Aber mir geht es nun in erster Linie um folgndes: Ich brauche eine Methode, die auch das Senden von Dateien wie z.B. .txt Dateien oder Videos, Sounds (usw) zu erlaubt(in diesem Fall erzwingt), denn solche Dateien sollen nicht im Browser aufgerufen werden, was ja der Normalfall ist.

Das Download erzwingen ist also dazu wichtig, dass wenn jemand einen Download online stellt, er sich nicht wundert, warum seine Datei nur geöffnet wird, statt runtergeladen zu werden. (Immerhin geht es um eine Downloadsektion, und nicht um eine "öffnen und anschauen"-Sektion) Der Downloadcontent wird später nicht nur von mir verwaltet (Ich hätte weniger Probleme, auf die Idee zu kommen, eine Archivdatei zu erstellen (z.B. .zip), die dann mit hoher wahrscheinligkeit immer gesendet wird), aber andere User, die eine Datei hochladen und anbieten, werden das Problem sicher nicht verstehen, sprich sie werden nicht auf die Idee kommen, eine Archivdatei zu erstellen.

Zitat:
Vollkommen zu recht, das ist kein gueltiger HTTP-Header
Danke, soweit war ich auch schon. Ich bräuchte vielleicht einen Lösungsvorschlag.

--

.

zum Seitenanfang zum Seitenende Profil || Suche
011
27.01.2007, 12:46
scus



Zitat:
Heini postete
[...] dass wenn jemand einen Download online stellt, er sich nicht wundert, warum seine Datei nur geöffnet wird, statt runtergeladen zu werden. [...]
Mach doch 'nen Hinweis: "Um die Datei herunterzuladen, drücken Sie 'Rechtsklick -> Speichern unter' (der genaue Wortlaut hängt vom verwendeten Browser ab)."

/edit: und jemand der sich dann noch wundert sollte vielleicht die Finger vom Internet lassen...

--

sincères amitiés scus
--
Tand, Tand ist das Gebilde von Menschenhand


Dieser Beitrag wurde am 27.01.2007 um 12:46 von scus bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
012
27.01.2007, 13:58
theDon



Zitat:
Heini postete
Danke, soweit war ich auch schon. Ich bräuchte vielleicht einen Lösungsvorschlag.
Was an ,,es geht nicht'' ist so schwer zu verstehen?

Zitat:
Es gibt keinen konformen Weg, einen User Agent zu zwingen, eine Datei herunterzuladen statt anzuzeigen (und das ist auch gut so).
Wenn du unbedingt meinst, das awer noetig, kannst du die Dateien ja noch serverseitig packen.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
013
29.01.2007, 02:36
oxff



Du kannst Text in ein Grafikformat rendern, dass der IE nicht unterstützt. Dann verlinkst du ein Programm um diese Grafiken anzeigen zu lassen. Du bist Deutschland (``Geht nicht? Ist scheisse? Go for it!'')!

--

mwcollect - mein Projekt | oxlog - mein blog | happyhardcore.com Stream - gute Musik

zum Seitenanfang zum Seitenende Profil || Suche
014
09.02.2007, 09:50
arashi



geht nich gibt's nich!

Ich hatte so'n ähnliches Problem.
Vielleicht hilft dir das hier weiter:

<?php
$file=$_GET['file'];
$path = 'http://localhost';
$link = ($path."/".$file); //Fileurl


if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') > 0) //Header für IE
{
$fsize = filesize($link);
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . $file);
header("Content-Length: ".$fsize);
if($res = readfile($link))
{
#download counter ++
}
clearstatcache();
}
else //Header für FF
{
$cfg['pageurl'] = ('http://localhost'); // URL vom Localhost
$type = eregi_replace ($cfg['pageurl'].'(.*)', 'LOCALHOSTFILE', $link);
$link = eregi_replace ('http://', '', $link);
$filename = $file;
Header('filename='.$filename);
$filedata = file_get_contents($filename);
Header('Content-Type: application/force-stream');
Header('Content-Disposition: Filename=' . basename($filename)); //Diese Zeile klappt nur beim FF
Header('Content-Length: ' . strlen($filedata));
Header('Expires: 0');
Header('Pragma: no-cache');
print $filedata;
}
?>

--

zum Seitenanfang zum Seitenende Profil || Suche
015
10.02.2007, 16:08
Heini



Cool danke, funktioniert jetzt ;)

--

.

zum Seitenanfang zum Seitenende Profil || Suche
016
28.02.2007, 08:33
arashi



yeah, gern geschehen :D

--

zum Seitenanfang zum Seitenende Profil || Suche