Seite 1 von 2

[php] Datei zum downloaden Anbieten, nicht phpBB

Verfasst: 10.02.2007 13:18
von Asmodiel
Hi!
ich brauch für meine hp, also nichts mit download mod oder so eine php-funktion mit der ich eine jpg-datei DOWNLOADEN lasse und nicht wie standartgemäß in 90% der browser anzeigen (also wenn ich *****.jpg aufrufe soll das downloadfenster kommen und nicht das angezeigte bild!)


kann mir da jemand helfen?
es geht halt um eine gallery!

gruß!
asmodiel

Ps.: suchfunktion hab ich hier, auf php.net, google und selfphp.de benutzt! o.O

Verfasst: 10.02.2007 13:35
von S2B
Versuch mal sowas:

Code: Alles auswählen

header('Content-type: application/octet-stream');
header('Content-disposition: attachment; filename=<Dateiname>');
header('Content-Length: <Dateigröße>');
readfile('<Pfad zur Datei>');

Verfasst: 10.02.2007 13:42
von Asmodiel
achso... und die dateigröße und so muss dabei sein?
naja... ich glaube, dass die einfachste version wäre, das in ne zip zu packen und gut iss :D

Verfasst: 10.02.2007 13:45
von Olli Oberhausen
IE und Opera brauchen jedoch application/octetstream - sonst klappts nicht in den Browsern...

Hat sich wohl jemand beim programmieren der Browser verschrieben :grin:

Gruß, Olli

Verfasst: 10.02.2007 14:05
von Asmodiel
danke euch beiden erstmal, aber wie soll ich das dann machen, dass ie opera und firefox das machen?
beide schnipsel nehmen?

Verfasst: 10.02.2007 14:36
von Xwitz
Die Funktion habe ich mir zusammengesucht:

Code: Alles auswählen

function makeDownload($file, $dir, $type) {

$file_kurz = $file;
$dirfile =  $dir.$file;

// Dateityp, der immer abgespeichert wird 
header("Content-Type: application/octetstream"); 

// Dateiname mit Sonderbehandlung des IE 5.5 
header("Content-Disposition: ".(!strpos($HTTP_USER_AGENT,"MSIE 5.5")?"attachment; ":"")."filename=$file_kurz"); 

// Im Grunde ueberfluessig, hat sich anscheinend bewährt 
header("Content-Transfer-Encoding: binary"); 

// Zwischenspeichern auf Proxies verhindern 
header("Cache-Control: post-check=0, pre-check=0"); 

// Dateigröße für Downloadzeit-Berechnung 
header("Content-Length: ".filesize($dirfile)); 

readfile($dirfile);
    
} 
Bisher habe ich damit keine Probleme festgestellt.

Verfasst: 10.02.2007 14:42
von Olli Oberhausen
Und ich das ganze auch noch mal :D

Code: Alles auswählen

<?php
function send_file($attachment, $upload_dir)
{
	global $_SERVER, $HTTP_USER_AGENT, $HTTP_SERVER_VARS, $lang, $db, $attach_config;

	$filename = ($upload_dir == '') ? $attachment : $upload_dir . '/' . $attachment;


	if (@!file_exists(@realpath($filename)))
	{
		die('Datei nicht gefunden: ' . $filename);
	}

	if (!empty($_SERVER['HTTP_USER_AGENT'])) 
	{
		$HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
	} 
	else if (!empty($HTTP_SERVER_VARS['HTTP_USER_AGENT'])) 
	{
		$HTTP_USER_AGENT = $HTTP_SERVER_VARS['HTTP_USER_AGENT'];
	}
	else if (!isset($HTTP_USER_AGENT))
	{
		$HTTP_USER_AGENT = '';
	}

	if (ereg('Opera(/| )([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) 
	{
		$browser_version = $log_version[2];
		$browser_agent = 'opera';
	} 
	else if (ereg('MSIE ([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) 
	{
		$browser_version = $log_version[1];
		$browser_agent = 'ie';
	} 
	else if (ereg('OmniWeb/([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) 
	{
		$browser_version = $log_version[1];
		$browser_agent = 'omniweb';
	} 
	else if (ereg('Netscape([0-9]{1})', $HTTP_USER_AGENT, $log_version)) 
	{
		$browser_version = $log_version[1];
		$browser_agent = 'netscape';
	} 
	else if (ereg('Mozilla/([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) 
	{
		$browser_version = $log_version[1];
		$browser_agent = 'mozilla';
	} 
	else if (ereg('Konqueror/([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) 
	{
		$browser_version = $log_version[1];
		$browser_agent = 'konqueror';
	} 
	else 
	{
		$browser_version = 0;
		$browser_agent = 'other';
	}

	$mimetype = ($browser_agent == 'ie' || $browser_agent == 'opera') ? 'application/octetstream' : 'application/octet-stream';

	header('Pragma: public');


	// Send out the Headers
	header('Content-Type: ' . $mimetype . '; name="' . $filename . '"');
	
	header('Content-Disposition: attachment; filename="'.$filename.'"');

	//
	// Now send the File Contents to the Browser
	//
	$size = @filesize($filename);
	if ($size)
	{
		header("Content-length: $size");
	}
	readfile($filename);

	exit;
}

		
send_file('help1.gif', 'images');

?>
Man sollte hier mal einen Tag einbauen "Antwort ist in Arbeit ;o)"

Olli

Verfasst: 10.02.2007 14:55
von Asmodiel
ich hab mal die kürzere version genommen und...
naja, ein bisschen verändert halt, header und footer included und titel dazugegeben...

Code: Alles auswählen

<?php
  $root_path = "./";
$page_title = "Download";

include($root_path.'includes/header.php');

  $file = $_GET['file'];
  $dir = "uploads/";

  function makeDownload($file, $dir) {

$file_kurz = $file;
$dirfile =  $dir.$file;

// Dateityp, der immer abgespeichert wird
header("Content-Type: application/octetstream");

// Dateiname mit Sonderbehandlung des IE 5.5
header("Content-Disposition: ".(!strpos($HTTP_USER_AGENT,"MSIE 5.5")?"attachment; ":"")."filename=$file_kurz");

// Im Grunde ueberfluessig, hat sich anscheinend bewährt
header("Content-Transfer-Encoding: binary");

// Zwischenspeichern auf Proxies verhindern
header("Cache-Control: post-check=0, pre-check=0");

// Dateigröße für Downloadzeit-Berechnung
header("Content-Length: ".filesize($dirfile));

readfile($dirfile);

}
makeDownload($file, $dir);
include ( $root_path.'includes/footer.php');
?>
o.O also als ich die testdatei "KF_girl_1.jpg" downloaden wollte und das noch nicht verändert hatte wurde alles normal gedownloaded.
NUR nachdem ich das getan hab kommt jetzt das hier:

Code: Alles auswählen

Warning: Cannot modify header information - headers already sent by (output started at /var/www/user/as/asmodiel/html/uploader/includes/header.php:6) in /var/www/user/as/asmodiel/html/uploader/download.php on line 16

Warning: Cannot modify header information - headers already sent by (output started at /var/www/user/as/asmodiel/html/uploader/includes/header.php:6) in /var/www/user/as/asmodiel/html/uploader/download.php on line 19

Warning: Cannot modify header information - headers already sent by (output started at /var/www/user/as/asmodiel/html/uploader/includes/header.php:6) in /var/www/user/as/asmodiel/html/uploader/download.php on line 22

Warning: Cannot modify header information - headers already sent by (output started at /var/www/user/as/asmodiel/html/uploader/includes/header.php:6) in /var/www/user/as/asmodiel/html/uploader/download.php on line 25

Warning: Cannot modify header information - headers already sent by (output started at /var/www/user/as/asmodiel/html/uploader/includes/header.php:6) in /var/www/user/as/asmodiel/html/uploader/download.php on line 28

$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ
und hier halt noch viele andere komische zeichen, die anscheinend vom jpg kommen, wenn man das mit dem texteditor öffnet o.O

o.O
was ist da los?!

Verfasst: 10.02.2007 14:58
von Olli Oberhausen
Du darfst keinen header includieren... Du willst doch eine Dtei senden und keine html seite ....

Olli

Verfasst: 10.02.2007 15:06
von Xwitz
Asmodiel hat geschrieben:naja, ein bisschen verändert halt, header und footer included und titel dazugegeben...
Die Funktion gibt nichts weiter als die Datei aus, sie muß über einen Link oder ein Formular angesprochen werden. Außerdem muß man noch etwas für die Sicherheit tun.

z.B.

Code: Alles auswählen

if(file_exists ($dir.$_GET['v']))     {...