PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Download einer umbenannten Datei


Don Colleone
29.12.2007, 15:09:44
Sehr geehrte Damen und Herren,
ich wünsche allen Lesern ein schönes und angenehmes Weihnachtsfest gehabt zu haben.

Nun zu meiner Frage. Ich habe eine PHP-Datei, der eine id übergeben wird. Diese soll dann auf eine Datei weiterleiten bzw. einen Download starten. EIgentlich ein ganz einfaches Prinzip, eine download.php.
Die Datei liest aus der DB den echten Namen aus

DB:

test.odt
bild.jpg


Das Ding ist aber, dass die Datei auf die weitergeleitet werden soll die id als Namen hat.

Dateienordner:
1.odt
2.jpg

Die Weiterleitung klappt eigentlich auch ganz gut, ebenso wie der Klick-Counter

Ich möchte jetzt aber, das die Datei, die runtergeladen wird nicht als 1.odt runtergeladen wird, sondern automatisch umbenannt wird in test.odt .

Mit Hilfe eines Kumpels habe ich es schon so weit gebracht, dass die Datei umbenannt wird, aber der Inhalt quasi nach PHP geparst wird, was ja bei jpg-Dateien eher suboptimal ist.


//mit hilfe der id die daten aus der db lesen
$orgdatei = id+endung; (1.odt)
$dateiname = der ursprünglich gespeicherte Name aus der DB (test.odt)

header("Content-Disposition: attachment; filename=".$dateiname);
include("$orgdatei");


Ich hoffe ihr könnt mir da einen Tipp geben, wie ich das anstelle, dass die Datei übertragen wird.

Gruß vom Don

rambi
29.12.2007, 15:41:48
//mit hilfe der id die daten aus der db lesen
$orgdatei = id+endung; (1.odt) // syntaxerror
$dateiname = der ursprünglich gespeicherte Name aus der DB (test.odt) // syntaxerror
// Content-Type fehlt noch
header('Content-Disposition: attachment; filename="'.$dateiname.'"');
readfile($orgdatei);

Don Colleone
29.12.2007, 15:50:32
//mit hilfe der id die daten aus der db lesen
$orgdatei = id+endung; (1.odt) // syntaxerror //das habe ich nur so zusammengeschreibselt, die variable $orgdatei gibt 1.odt aus
$dateiname = der ursprünglich gespeicherte Name aus der DB (test.odt) // syntaxerror //genauso wie oben: test.odt
// Content-Type fehlt noch //das sind ja immer unterschiedliche dateien, also was soll ich machen?
header('Content-Disposition: attachment; filename="'.$dateiname.'"');
readfile($orgdatei); ---

rambi
29.12.2007, 17:32:49
Wenn sich es wirklich nur um Downloads dreht, könnte dieses reichen:
header("Content-Type: application/force-download");

Don Colleone
29.12.2007, 17:54:31
Danke für den Tipp, aber so klappt es leider auch nciht, es wird immer noch der Dateiname angezeigt, so wie die Datei auf dem Server heißt und nicht der, der aus der DB geladen wird.

Meinstest du das so:

header("Content-Disposition: attachment; filename=".$dateiname); //$dateiname = test.odt
header("Content-Type: application/force-download");
header("Location: $orgdatei"); //$orgdatei = 1.odt


Ich habs grade nochmal so probiert, aber da kommt auch nix sinnvolles bei raus:

$dateihandle = fopen($orgdatei,"r");
$daten = fread($dateihandle);
print $daten;
fclose($dateihandle);

rambi
29.12.2007, 18:26:42
entweder: header("Content-Disposition ..............
oder: header("Location: ...................
Entscheide dich!!

Don Colleone
29.12.2007, 18:29:54
Wie dem auch sei. Danke für deine Hilfe, aber ich habs jetzt und es funktioniert genauso, wie ich es wollte:

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$dateiname);
header("Content-Type: application/force-download");
$dateihandle = fopen( "$orgdatei","rb");
$daten = fread($dateihandle,filesize($orgdatei));
print "$daten";
fclose($dateihandle);

rambi
29.12.2007, 18:39:32
Ein doppelter Content-type ist auch Sinnfrei!!

Don Colleone
29.12.2007, 18:54:06
Ein doppelter Content-type ist auch Sinnfrei!!

Ach menno, ist doch wumpe.... ich habs ja auch schon weggemacht. Aber bind abei aufs nächste Problem gestoßen:

Wenn $dateiname eine Zeichenkette mit Leerzeichen enthält, wird nur der Text bis zum ersten Leerzeichen angezeigt. Ich habe jetzt schon diverse Anführungszeichen-Kombinationen ausprobiert, jedoch ohne Erfolg.
Gibts da eine Funktion für, dass der ganze String angezeigt wird?

Workaround:

$dateiname = str_replace(" ", "_", $dateiname);