[PHP] downloadscript mit parameter

DHMH

Enthusiast
Thread Starter
Mitglied seit
07.08.2008
Beiträge
82
Hallo,
erst mal vorweg:
Ich hoffe, ich bin im richtigen Forum!
Also:
Ich möchte mir ein PHP Script programmieren, dass ich z.B. so aufrufe:
www.domain.de/download.php?name=Programm
und das dann www.domain.de/files/programm/programm.zip heruntergeladen wird.
Bisher hab ich folgenden Code:
PHP:
<?
$files = Array("Programm" => "Programmname/Programm.zip",
"2" => "test.doc",
"3" => "test.xls",
"4" => "test.pdf",
"5" => "test.gif");

$filename = "files/".$files[$_GET[name]];

header("Content-Type: x-type/subtype");
header("Content-Length: ".filesize($filename));
header("Content-Disposition: attachment; filename=".$files[$_GET[name]]);
readfile($filename);
?>
Wenn ich dann www.domain.de/download.php?name=Programm aufrufe, bekomme ich die Datei aus dem Ordner Programmname/Programm.zip zwar, aber dann hat sie den Namen Programm_Programm.zip!
Was ist das Problem und wie kann ichs beheben?:hmm:
Danke im Voraus!:shot:
MfG,
DHMH
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
der / ist ein ordnertrennen auf den meisten betriebssystemen und daher nicht in einem Dateinamen erlaubt. Und der wird dann irgendwie umgewandelt.

Trenne mal den Dateinamen vom Pfad und gibt bei "filename" nur den wirklichen Namen an.
 
Das funktioniert!
Aber wie krieg ichs hin, wenn die Datei in nem anderen Verzeichnis liegt?
 
PHP:
 Array("Programm" => array ('path' => "Programmname/Programm.zip", name => 'programm.zip'), 
"Programm2" => array ('path' => "Programmname/Programm2.zip", name => 'programm2.zip')); 


$filename = "files/".$files[$_GET[name]]['path']; 

header("Content-Type: x-type/subtype"); 
header("Content-Length: ".filesize($filename)); 
header("Content-Disposition: attachment; filename=".$files[$_GET[name]]['name']); 
readfile($filename);
 
Irgendwie wills immernoch nicht klappen!
Jedenfalls hab ich jetzt ein anderes Problem:
Er downloadet die download.php statt die Programm.zip !
 
Meinst du nicht, dass diese Methode so oder so etwas unsicher ist? Ich kenne mich bei den Headern zwar nicht so gut aus - aber einen Dateidownload via URL-Paramenter zu bestimmen lassen, ist schon etwas unsicher.

Wäre es so nicht klüger? (ist schnell geschrieben... nix getestet oder so)
PHP:
<?php
$dir['default'] = 'downloads/'; // default directory
$dir['custom1'] = 'suppe/'; // custom directory

$c = 0; // interal counter
$files = array($c++ => 'test', $c++ => $dir['custom1'].'test2');

if(is_numeric($_GET['file_id'])) {
	$filename = $files[$_GET['file_id']];
	$checkFilename = strpos($filename, '/');
	
	if($checkFilename === false) {
		$filename = $dir['default'].$filename;
	}
	
	// some other code...
} else {
	die('You are not cool enough, too view faked urls!!! :/');
	exit;
}
?>

Hat folgende Vorteile:
1. Du brauchst die IDs der Programme nicht seperat berechnen - sie laufen über den internal Counter $c.
2. Die gegebene URL wird nochmal überprüft auf Richtigkeit (IDs können nur numeric sind ^^)
3. Falls du im Array ein Programm kein $dir zugewiesen hast, wird autom. das $dir['default'] vorne dran gehängt.
4. Scheint für mich eleganter.
5. preg_match() absichtlich nicht verwendet, da resourcesparender (kein regexp)
 
Zuletzt bearbeitet:
1. Du brauchst die IDs der Programme nicht seperat berechnen - sie laufen über den internal Counter $c.
ganz toll, eignet sich auch super um drauf zu verlinken. und wenn du den counter von 0 an beginnst und eh immer noch hochzaehlst, dann kannst dir auch gleich sparen ihn explizit nochmal mitzuzaehlen.

4. Scheint für mich eleganter.
leider hilft es ihm kein stueck weiter, weil du auf sein aktuelles Problem nicht eingehst.

so laeuft es jetzt bei mir, und ich ueberpruefe auch noch, dass nur von dir im array definierte downloads abgerufen werden koennen.
PHP:
$files =  array(
    "Programm" => array (
        'path' => "Programmname/Programm.zip", 
        'name' => 'programm.zip'
    ),
    "Programm2" => array (
        'path' => "Programmname/Programm2.zip", 
        'name' => 'programm2.zip'
    )
);

if (isset($_GET['name']) && array_key_exists($_GET['name'], $files)) {
    $filename = "files/" . $files[$_GET['name']]['path'];

    header('Content-Type: ' . mime_content_type($filename));
    header('Content-Length: ' . filesize($filename));
    header('Content-Disposition: attachment; filename="' . $files[$_GET['name']]['name'] . '"');

    readfile($filename);
} else {
    die('invalid');
}
 
ganz toll, eignet sich auch super um drauf zu verlinken. und wenn du den counter von 0 an beginnst und eh immer noch hochzaehlst, dann kannst dir auch gleich sparen ihn explizit nochmal mitzuzaehlen.


leider hilft es ihm kein stueck weiter, weil du auf sein aktuelles Problem nicht eingehst.

so laeuft es jetzt bei mir, und ich ueberpruefe auch noch, dass nur von dir im array definierte downloads abgerufen werden koennen.
PHP:
$files =  array(
    "Programm" => array (
        'path' => "Programmname/Programm.zip", 
        'name' => 'programm.zip'
    ),
    "Programm2" => array (
        'path' => "Programmname/Programm2.zip", 
        'name' => 'programm2.zip'
    )
);

if (isset($_GET['name']) && array_key_exists($_GET['name'], $files)) {
    $filename = "files/" . $files[$_GET['name']]['path'];

    header('Content-Type: ' . mime_content_type($filename));
    header('Content-Length: ' . filesize($filename));
    header('Content-Disposition: attachment; filename="' . $files[$_GET['name']]['name'] . '"');

    readfile($filename);
} else {
    die('invalid');
}

Danke! funzt! :)
MfG,
DHMH
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh