Variable Variablen in Download-Script

Hey, ich versuche grad ein Script zu schreiben, das den Download von Dateien erzwingt und nebenbei noch den Dateinamen- und Speicherort nicht anzeigt. Das ist in diesem Fall noch nicht gut gelößt, aber gerade nebesächlich, das wird später geändert. Worum es eigentlich geht:

<?php
$a = arbeit.pdf;
$b = handout.pdf;
$c = praesentation.pps;
//$Datei = $$fileid;
$Dateiname = basename($Datei);
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename='.$Dateiname.'");
readfile(${$fileid});
?>

So sieht das Ding aus, die Variable $fileid wird aus einer anderen Datei per URL übergeben, also so: download.php?fileid=xxx
und je nach dem, welche fileid übergeben wird, sollte eigentlich die jeweilige Datei zum Download angeboten werden. Das aber funtzt nich, weiß jemand warum?

P.S: Die Zeile 5 is auskommentiert, so sollte es theoretisch auch gehn, aber das geht auch nich.

DANKE LeX

Das funktioniert nicht, da register_globals hier deaktiviert ist. Außerdem, woher soll die Variable $Datei kommen? Die 8. Zeile enthält auch einen Fehler. Ist übrigens kein so toller Ansatz, mit einem Array bist du da besser beraten. :wink:

<span class="#000000"> <span class="#0000BB"><?php<br />$files&nbsp;</span><span class="#007700">=&nbsp;array(<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="#DD0000">'a'&nbsp;</span><span class="#007700">=>&nbsp;</span><span class="#DD0000">'arbeit.pdf'</span><span class="#007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="#DD0000">'b'&nbsp;</span><span class="#007700">=>&nbsp;</span><span class="#DD0000">'handout.pdf'</span><span class="#007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="#DD0000">'c'&nbsp;</span><span class="#007700">=>&nbsp;</span><span class="#DD0000">'praesentation.pps'<br /></span><span class="#007700">);<br />if&nbsp;(!isset(</span><span class="#0000BB">$_GET</span><span class="#007700">[</span><span class="#DD0000">'fileid'</span><span class="#007700">],&nbsp;</span><span class="#0000BB">$files</span><span class="#007700">[</span><span class="#0000BB">$_GET</span><span class="#007700">[</span><span class="#DD0000">'fileid'</span><span class="#007700">]]))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;die(</span><span class="#DD0000">'Ungueltige&nbsp;ID!'</span><span class="#007700">);<br />}<br /></span><span class="#0000BB">$file&nbsp;</span><span class="#007700">=&nbsp;</span><span class="#0000BB">$files</span><span class="#007700">[</span><span class="#0000BB">$_GET</span><span class="#007700">[</span><span class="#DD0000">'fileid'</span><span class="#007700">]];<br /></span><span class="#0000BB">$filename&nbsp;</span><span class="#007700">=&nbsp;</span><span class="#0000BB">basename</span><span class="#007700">(</span><span class="#0000BB">$file</span><span class="#007700">);<br /></span><span class="#0000BB">header</span><span class="#007700">(</span><span class="#DD0000">'Content-Type:&nbsp;application/force-download'</span><span class="#007700">);<br /></span><span class="#0000BB">header</span><span class="#007700">(</span><span class="#DD0000">"Content-Disposition:&nbsp;attachment;&nbsp;filename=\"$filename\""</span><span class="#007700">);<br /></span><span class="#0000BB">readfile</span><span class="#007700">(</span><span class="#0000BB">$file</span><span class="#007700">);<br /></span><span class="#0000BB">?></span></span>

Jap, eindeutig…

Oder das Lesen aus einer Datei:

Die Datei “Dateien.txt”

a|datei1.jpg
b|datei2.rar
c|datei3.zip

Und PHP-Code:

$temp = file("dateien.txt");
$files = array();
foreach($temp as $number => $one)
{
    $one = explode("|",$one);
    $files[$one[0]] = $one[1];
}

$datei = $files[$_GET["fileid"]];

Keine PHP3-Standards verwenden :wink:

Was meinst du damit?

register_globals wurde großteils schon mit PHP4 abgesetzt… (PHP5 brachte nun den entgültigen Umschwung)

Seit 4.2 ist es standardmäßig off, seit PHP 6 existiert es nicht mehr. War es in PHP 3 immer on? PHP 3 habe ich nicht erlebt, habe direkt mit PHP 4 angefangen. :wink:

Erstmal Danke für die ganzen Antworten!

Die Version von michi7x7 funktioniert!!

Allerdings tut sich dabei nun noch ein kleines Problem auf, nämlich, dass beim Download als Filetyp Microsoft-Word-Dokument angegeben wird… So will Firefox es auch downloaden.
Wenn man es aber direkt öffnen lässt (also temporär speichern und in adobe reader öffnen) geht es ohne Probleme.
Is also nur n Problem des erkannten/angegebenen Dateityps.

So siehts jetzt aus:

<?php
$a = "arbeit.pdf";
$b = "handout.pdf";
$c = "praesentation.pps";
$Dateiname = basename(${$_GET["fileid"]});
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=$Dateiname");
readfile(${$_GET["fileid"]});
?>

Ach ja: Falls das nicht zu kompliziert is, könnte noch jemand poste was da noch rein muss, damit ne Fehlermeldung, ausgespuckt wird, falls es die Datei nicht gibt. Am besten in einer kleinen Messagebox, mit “ok” schaltfläche

Danke im Voraus
LeeXX

1.) Ich würde dir Umbedingt zu einem Array raten (bzw. das holen der Daten aus einer Datei)
2.)Dein Header ist Quatsch (“Content-Type: application/force-download”), diesen MIME-Typ gibt es nicht, du solltest diesen hier verwenden [quote]“Content-Type: application/octet-stream”[/quote]
Der ist für allgemeine Sachen (Octet = Acht, Stream = Folge, also eine Folge asu Bytes, und das ist so “ziemlich” jede Datei…)

Danke, jetzt funktioniert es. Allerdings hab ich das mit der „dateien.txt“ mal ausprobiert, und da lädt er eine 0-byte Datei herunter, die hat zwar den richtigen Namen, aber er findet wohl die echte Datei nicht. Gibts da noch eine elegantere Lösung, die Dateien in einer externen Datei zu speichern, möglichst auch noch so, dass dort der Speicherort angegeben ist und diese „Dateien.txt“ auch wenn man ihren Speicherort kennt nicht einsehbar/herunterladbar ist?

Und noch zu guter letzt:

  1. Was noch super wäre, ne saubere Fehlermedung, falls es die angeforderten Dateien nicht gibt.
  2. Dass man nicht direkt auf die downloads.php zugreifen kann

Danke für alle Antworten!! :hail:
LeeXX

Du musst in der Datei den relativen Pfad (“downloads/archives/test.rar”) angeben :wink: