Download von CorelDraw-Dateien

Kretzsche

Grünschnabel
Hallöchen Freunde der Sonne...

hab mal ein Problemchen.

Ich hab mir einen Upload mit PHP gebastelt, funktioniert auch einwandfrei, kann alles auf den Server hochladen und dann über einen Link wieder downloaden.
Mein Problem liegt nur darin, dass ich keine Coreldraw-Dateien (.cdr) runterladen kann.
Hab auch schon den MIME-TYPE auf Image/x-coreldraw gesetzt.

Wenn mir jemand helfen kann das Problem zulösen sollte er sich bitte melden, ist echt wichtig.

Danke schon mal im Voraus Kretzsche!
 
Wie wärs mal mit einer genauen Fehlerbeschreibung? Was genau funktionert nicht beim Download?
Poste evtl. mal ein bisschen Code, dann erhöht sich die Chance, daß dir hier geholfen wird.
 
Also, das Problem liegt darin, dass wenn ich auf den Link klicke, mir angezeigt wird, dass diese Seite nicht angezeigt werden kann, obwohl die Datei allerdings auf dem Server liegt.
 
Vielleicht hilft dir das hier weiter...

Machst du irgendwelche bestimmte Angaben im Header ? Oder hast du ein spezielle Serverkonfiguration (z.B. über .htaccess mittels AddType wär da so eine Möglichkeit)?

Was genau soll denn geschehen, wenn man auf den Downloadlink klickt ?

Möglicherweise könntest du mittels einer Anweisung in der .htaccess-Datei deinem Server die Dateiendung "beibringen".
 
Den Download-Link setzt du einfach auf eine PHP-Datei mit folgendem Inhalt:
PHP:
<?php

   $file = "downloads/dateiname.cdr";

   header('Content-type: application/force-download');
   header('Content-Transfer-Encoding: Binary');
   header('Content-length: '.filesize($file));
   header('Content-disposition: attachment;filename='.basename($file));
?>
Den Dateinamen kannst du natürlich auch per Parameter übergeben, dann musst du aber darauf achten, dass man nur Dateien innerhalb des download-Verzeichnisses downloaden kann, ansonsten könnte ein Angreifer mit Leichtigkeit alle möglichen Dateien deines Servers klauen (abhängig von den Sicherheitseinstellungen dessen).
PHP:
$file = "downloads/".$_GET["file"];
if(!file_exists($file))
   die("Datei existiert nicht!");

#header setzen
 
Zwei Fehler hat dein Vorschlag, split: Erstens gibt es den MIME-Typ application/force-download nicht, stattdessen sollte application/octet-stream genommen werden, und zweitens wird der zweite Parameter filename des Content-Disposition-Header-Feldes in Anführungsstriche notiert.

Daher lautet mein Vorschlag:
PHP:
<?php

	$file = 'downloads/dateiname.cdr';
	if( !is_file($file) ) {
		header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
		exit();
	}
	if( !is_readable($file) ) {
		header($_SERVER['SERVER_PROTOCOL'].' 500 Internal Server Error');
		exit();
	}

	header('Content-Type: application/octet-stream');
	header('Content-Transfer-Encoding: binary');
	header('Content-Length: '.filesize($file));
	header('Content-Disposition: attachment; filename="'.basename($file).'"');
	readfile($file);
	exit();
	
?>
 
Weiß ich nicht. Ich habe dieses Beispiel aus den Kommentaren zur header() Funktion auf php.net, funktioniert hat es bei mir fehlerfrei.

Und zu force-download: Stimmt, dieser MIME-Typ existiert nicht, wird jedoch sehr oft in Verbindung mit Downloadscripts verwendet und funktioniert einwandfrei.
 
Und zu force-download: Stimmt, dieser MIME-Typ existiert nicht, wird jedoch sehr oft in Verbindung mit Downloadscripts verwendet und funktioniert einwandfrei.
Das glaube ich gern, denn auch ein als application/foobar ausgeliefertes Dokument wird – da der User Agent höchstwahrscheinlich nichts mit dem MIME-Typen anfangen kann – zum Herunterladen angeboten.
 
Soweit ich dass weiß, bestimmt der

header('Content-Disposition: attachment; filename="'.basename($file).'"');

,ob eine Datei downgeloaded werden soll, oder, wenn dieser Header weggelassen wird, z.B. wie ein PDF per Plugin direkt im Browser angezeigt wird.

Marcus.
 
Zurück