PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Download-Manager nutzen


jpl
12.08.2002, 22:18:41
Hallo,
wie schaffe ich es, das mein Download manager sich startet anstatt des übliche Windows Download, wenn ich eine Datei durch ein PHP-Script per readfile() und headern ausgebe?
Gruß JP

Progman
12.08.2002, 23:43:02
muss auch ein entsprechenden Typ senden, z.b. application/zip oder so. Denn der DL-Manager springt nur bei bestimmten Typen an, aber nicht beim üblichen verwendeten octed-stream

Denk ich mir jetzt mal so, ob das stimmt weiß ich nicht, hab schließlich kein DL-Manager geproggt.

SPiC
13.08.2002, 00:06:03
Kommt ganz auf den Downloiadmanager an. Bei einigen Kannst Du konfigurieren, welche MIME-Typen er abfängt. Versuche es am besten mit x-type/subtype, da sollte eigentlich jeder DL anspringen.

Du könntest es auch mit

header("Content-disposition: attachment; filename="$filename"");

versuchen.


=:-) Sebastian

Matt
13.08.2002, 10:07:43
header("Content-type: Application/zip");
sollte der DL Manager nehmen, wenn das ding vernünftig eingestellt ist.

SPiC
13.08.2002, 10:20:58
Hmm, ganz genau betrachtet, ist es ja eigentlich kein PHP-Problem, es kommt ja auf den DL-Manager an... 100% sicher sein, dass er startet, kannst Du nicht..

jpl
13.08.2002, 12:00:55
Ich wäre schon froh wenn er überhaupt starten würde :) Also die header habe ich so gesendet.

header("Content-length: $size");
header("Content-Type: application/downloadn");
header("Content-Disposition: attachment; filename=$file");
header("Content-Transfer-Encoding: binary");

und dann readfile.
Das ganze ist nen Link. Auf den kann man klicken und der normale Download kommt, man kann sagen rechtsklick Speichern unter und das Script liefert die richtige Datei weiter und das klappt auch bestens, nur wenn ich dann sage "Mit Flashget laden" (oder einem der anderen DL-Manager) dann funzt das nicht, denn der lädt gar nichts herrunter. Leider nicht nur der sondern alle DL-Manager, auch bei Freunden. Der Referrer stimmt. Tja, ich hab auch schon alle Optionen des DL-Manager ausprobiert und ändert das null. :(

|Coding
13.08.2002, 21:18:42
ich weis nicht, aber vielleicht arbeiten die dl manager etwas anders als wie die user... die nur klicken...

vielleicht verfolgen die dl manager den link bis zum file und da sie sicher kein php können, werden sie ins nimmerland geführt...

ist nur ne theorie... :-)

jpl
15.08.2002, 12:18:16
Ja, das ist net gute Theorie nur identifiziert sich mein DL-manager als IE 5.x. Und ich hab mich mal auf diversen Seiten umgesehen die sowas nutzen und bei denen klappt das. Wobei die nicht alle PHP verwenden. Naja. Ich habs fast aufgegeben, müssen die User halt ohne DL-Manager downloaden.
JP

Matt
15.08.2002, 12:54:52
also usability und downloadmanager sind da so eine sache: Eine File kleiner als 10 MB würde ich garnicht mit nem downloadmanager runterladen wollen, weil der geschwindigkeitsvorteil von DL Managern marginal ist, aber die dinger sehr klobrig sind und man sich beim runterladen tonnenweise spyware einfängt.
Wie auch immer für kleine dateien (kommt halt drauf an, was du zum runterladen anbieten willst) würde ich NIEMALS einen downloadmanager verwenden, insofern bringt das dann auch nichts, meine idee, warum das nicht klappen könnte ist folgende: Vielleicht ignoriert der DL Manager einfach GET und/oder POST Variablen, wenn er was zum runterladen anfordert.
Jedenfalls kann er sicher nicht das HTTP Protokoll überspringen, weil das wäre bei den servern nicht möglich, weil die nicht einfach tausende ports offen lassen. Vielleicht mag er es nicht, das das ausgabefile gestreamed wird, mach doch mal folgendes:
<?
ob_start();
header(...);
readfile()..
ob_end_flush();
?>
das ist zwar von der performance her eine reine katastrophe, aber vielleicht gehts damit.

jpl
15.08.2002, 23:56:08
ob_start(); ? :) Was ist das? Probiere ich gerne mal aus, wenn du mir vorher noch sagst was das macht ;) Übrings klar für kleine Datein lohnt des sich nicht, aber bei mir sind Datein in der Größerordnung von 3 Stelligen MB Zahlen der Fall und da wäre ein DL-Manager sehr nett :)
JP

Matt
16.08.2002, 09:31:07
hi
also ob_start startet den output buffer, sprich, es schickt die daten nicht streamend, wie es normalerweise der fall wäre (wenn ein zeichen eingelesen wird, wird es ausgegeben), sondern schickt alles, sobald das ganze script durchgelaufen ist, oder der output buffer voll ist (glaube ich) und bei dreistelligen MB Zahlen, kannst du das sowieso vergessen, weil das den server ziemlich zu boden nagelt, wenn du hunderte MBs in den arbeitsspeicher schreiben willst. zumindest befürchte ich das mal so spontan! Spic weiss da wahrscheinlich mehr über die PHP interne architektur, und wie der buffer gespeichert wird. Wenn du da einige hundert MB große downloads machst, rate ich dir übrigens SEHR stark von der methode ab, mach doch so ein script:

dl.php?fileid=17

<?
$fileid=$_GET["fileid"];
/* jetzt such dir die entsprechende file
zur ID raus, beispielsweise über Datenbank oder sowas
und speichere sie in $filepath ab
*/
header("location: $filepath");
print "download wird gestartet... bitte warten!";
?>

du musst nur aufpassen, dass vor dem header kein zeichen (nicht mal ein leerzeichen gesendet wird, weil sonst ist der header deplatziert, da der header (logischerweise) das erste sein muss, dass der client kriegt.
Mit dem script leitest du den client direkt auf das file weiter, der dl manager wird anspringen und den download abfangen, der Browser wird allerdings (im normalfall zumindest) auf dieser seite bleiben, weil er ja ein file nicht anzeigen, sondern nur downloaden kann. Garantieren kann ichs natürlich nicht, aber download.com beispielsweise wirds kaum anders machen ;)

edit: ich habe noch eine idee:
der header string Content-length gibt an, wie groß der inhalt ist. beispielsweise

header("Content-length: 20"); wäre für ein 20 Byte großes file, vielleicht kannst du das noch irgendwie in dein ursprüngliches script einbauen, dann musst du noch die dateigröße der file rauskriegen, sie angeben, und schon könnte es funktionieren, weil das ist das einzige, was (denke ich) fehlen könnte, damit ein DL manager funktioniert: die gesamt dateigröße.

jpl
18.08.2002, 13:23:31
Hallo,
danke für die ausführliche Antwort. Wie man etwas weiter oben sieht, habe ich die Dateigröße bereits berücksichtigt. Das wars leider nicht. Das mit dem direkten zugriff auf die Datei ist ne gute Idee, hat bei mir nur zum Teil einen Hacken. Nicht alle Datein (für den Download) liegen im http zugänglichen Bereich sondern im Root. -> Erklärung: Wurde so gewünscht aus SIcherheitsgründen, weil manche Datein nur bestimmten Usern zugänglich gemacht werden sollen. Das heißt, das Script muss schon irgendwie die Datei durchleiten. Ich habe leider auch nicht so die Ahnung von Servern oder die PHP interne Architektur.
Trotzdem vielen Dank schonmal!
Gruß JP