PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zwangsdownload ohne fread oder fopen


Don Colleone
14.06.2008, 12:08:34
Moin,
ich hab da mal ne Frage und zwar bastel ich gerade an einem Downloadskript, das einen Downloadlink einer externen Seite bereitstellt.

Das Problem an der Sache ist, dass der Lesezugriff von meiner Domain her gesperrt ist, somit funktionieren die Funktionen fread() oder fopen() nicht.

Im Prinzip soll mein Skript ja nur bewirken, dass ein Download des bereit gestellten Links startet. Deswegen ist eine Übertragung zu meinem Server überflüssig.

Ich hoffe ihr habt mein Anliegen einigermaßen verstanden.

Achso mein jetziges Force-Downloadskript ist relativ simpel:

Es wird übrigens einfach nur ein Link in die GET Variable gepackt, wie zB. http://www.link-zur-datei.de/bild.jpg


<?php

$dateiname = $_GET['dateiname'];

header("Content-Disposition: attachment; filename=$dateiname");
header("Content-Type: application/force-download");
$d = fread($dateiname);

?>

Domi
14.06.2008, 22:31:59
Hi,

das ist ganz einfach, du machst das Downloadscript einfach auf den Server aum die Bilder liegen wenn du diese schützen willst.

Ansonsten würde ich davon abraten den Inhalt von GET ungeprüft für fread zu verwenden, denn so kann ganz schnell ein Sicherheitsrisiko entstehen. Du solltest prüfen welche Dateien man öffnen darf und welche nicht.

Domi

Don Colleone
15.06.2008, 14:54:06
Moin,

das ist ganz einfach, du machst das Downloadscript einfach auf den Server aum die Bilder liegen wenn du diese schützen willst.

eben das ist ja nicht möglich, da Links zu externen Quellen bereit gestellt werden.

Ansonsten würde ich davon abraten den Inhalt von GET ungeprüft für fread zu verwenden, denn so kann ganz schnell ein Sicherheitsrisiko entstehen. Du solltest prüfen welche Dateien man öffnen darf und welche nicht.

Das Ganze ist ja noch nciht fertig und noch in Arbeit. Aber es muss ja erstmal so funktionieren, bevor Sicherheitsmachanismen eingebaut werden. ;-)


Gibt es denn überhaupt eine andere Möglichkeit, als readfile() oder fopen() ?

Domi
15.06.2008, 14:57:27
Dann müsstest du die Bilder von der externen Quelle holen und zwischenzeitlich bei dir speichern, aber das wird alles andere als performant sein.

Anders, denke ich, wird es nicht gehen.

Domi

Don Colleone
17.06.2008, 15:40:13
Das Problem ist ja eben, dass ich keinen Zugriff auf den Server habe von meinem Server aus.
Die Dateien können nur vom CLient direkt heruntergeladen werden.

Wenn ich sie zwischenspeichern könnte, dann wäre es erstens illegal und zweitens wäre dann auch fileread oder fopen möglich. Diese beiden Funktionen machen ja schließlich nichts anderes.

Domi
17.06.2008, 15:47:06
Jetzt könnten sich noch die JavaScriptler zu Wort melden, vielleicht gibts da ja eine Möglichkeit?

smartweb
17.06.2008, 16:09:25
Wie siehts aus mit der Verwendung von Curl?


Alterantiv einfach via header("Location: $url"); umleiten?

Domi
17.06.2008, 16:22:15
Na, aber wenn er direkt auf ein Bild umleitet wird es im Browser angezeigt und net downgeloaded oder?

smartweb
17.06.2008, 18:05:55
Na, aber wenn er direkt auf ein Bild umleitet wird es im Browser angezeigt und net downgeloaded oder?

Das ist wahr.

Also bleibt nur


<?php

$url = $_GET["url"];
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=$url");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
curl_setopt($ch,CURLOPT_ENCODING , "UTF-8");
$data = curl_exec($ch);
echo $data;
?>


Dabei wird das File ja nicht gespeichert, von da her erfüllt es die Anforderung :-)

Don Colleone
25.06.2008, 17:14:32
Erstmal danke ich dir für deine Mühe,

das Ganze ist jetzt auch mehr oder weniger fertig. Zumindest "beta-fertig"

Wer will kann sich das Teil mal anschauen:
www.bilderluemmel.de.vu (http://www.bilderluemmel.de.vu)

Domi
30.06.2008, 21:21:04
if(file_exists($leadon . $file)) {
header("Content-type: application/x-download");
header("Content-Length: ".filesize($leadon . $file));
header('Content-Disposition: attachment; filename="'.$file.'"');
readfile($leadon . $file);
die();
}

Don Colleone
02.07.2008, 11:22:34
Hi Domi,

falls du die Überschrift des Themas gelesen hättest, dann hättest du auch gewusst, dass eben dieses Skript nicht funktioniert.

readfile($leadon . $file);

Das macht nämlich nichts anderes als fread oder fopen

Gruß

Domi
02.07.2008, 11:24:02
Wollte das nur wegen der Vollständigkeit anfügen ;)