Archief - PHP: Een file downloaden

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

McBr@in

Legacy Member
Ik heb dus een klein systeempje gemaakt. Waarvoor het juist moet dienen is niet echt van belang. Binnen dit systeem zit een module voor het verzenden van berichten (iets in de aard van private messages op een forum).

Nu is het mogelijk om bij zo een bericht een bijlage toe te voegen. Dit lukt allemaal, alsook het bestand initialiseren voor download. Maar de bestanden worden telkens geopend in de browser. Hoe kan ik ervoor zorgen dat elk bestand dient opgeslagen te worden op de pc ongeacht de extensie ervan?

Dit is wat ik momenteel al heb:

PHP:
if($action == 'download')
		{
			$path = "../../../attachments";
			header('Content-type: application/octet-stream');
			//header('Content-Type: application/force-download');
			if(preg_match("/MSIE 5.5/",$_SERVER['HTTP_USER_AGENT']))
			{
				header('Content-Disposition: filename= '.$filename);
			}
			else 
			{
				header('Content-Disposition: attachment; filename= '.$filename);
			}
			if(strpos($_SERVER['HTTP_USER_AGENT'],'MSIE'))
			{
				header('Pragma: ');
				header('Cache-Control: ');
				header('Cache-Control: public'); 
			}
			header('Content-Description: '.$filename);
			header('Content-transfer-encoding: binary');

			$full_file_name = $path.'/'.$fileName;
			
			$fp=fopen($full_file_name,'r');
			fpassthru($fp);
		}

Op het path dien je nog niet te letten, dit is maar een locale test, de attachments worden normaal ergens anders opgeslagen.

Radiance

Legacy Member
PHP:
header('Content-Disposition: attachment; filename="somefilename"');

Nu blijkbaar heeft het filename gedeelte in een applicatie waar ik atm aan werk geen effect. Iemand enig idee waarom niet? (IE 6 is de enige gebruikte browser).
Al uw andere headers zijn bij mijn weten nutteloos.

RpR

Legacy Member
Ik weet niet of er een betere oplossing is maar ik zou gewoon het bestand zippen adhv van php en dan krijg je normaal altijd de download vraag.

McBr@in

Legacy Member
Jah, ik heb ook al zoiets zitten denken. Ofwel bestandtypes die niet automatisch een download starten (txt, html,php,xml,pdf) etc gewoon weigeren. Maar voor pdf is dit wel nogal lastig.

Maar er wordt aan gewerkt :D

McBr@in

Legacy Member
Ik kan het wel laten werken als ik men <a href> van files rechtstreeks link naar de locatie. Maar ik zou toch liever gebruik maken van een javascript (kwestie van toch de locatie ed. te verbergen). Probleem is, de file wordt gevonden, maar de inhoud wordt getoond in mijn venster, gewoon boven all de php-code. Hij doet dit voor elk type van bestand, zelf voor word en excel etc. Ik zou toch graag hebben dat de inhoud van een bestand niet wordt getoond, maar dat de browser bij aanklikken van het bestand gewoon de downloadoptie geeft.

Bram

Legacy Member
omfg (warhead.be) heeft zo een functie in z'n cms geloof ik, ik zal hem er eens op wijzen (als ie dees topic al nie zelf ziet) of die niet kan helpen...

McBr@in

Legacy Member
SveltestSword zei:
omfg (warhead.be) heeft zo een functie in z'n cms geloof ik, ik zal hem er eens op wijzen (als ie dees topic al nie zelf ziet) of die niet kan helpen...

Nice :) ik volg het hier wel. Ben nu al een 4-tal uren op hetzelfde aan het zoeken en is best wel kut dat het niet werkt zoals het hoort :D

Radiance

Legacy Member
Misschien enkel voor IE (enige platform dat ik ermee moet testen), maar de header zoals ik hierboven vermeld werkt perfect hoor .. juist het meegeven van een filename wil niet lukken.

McBr@in

Legacy Member
RpR zei:
Ik weet niet of er een betere oplossing is maar ik zou gewoon het bestand zippen adhv van php en dan krijg je normaal altijd de download vraag.

Het doen via een zip-file gaat ook niet. Zou het kunnen liggen omdat ik dit doe op volgende wijze:

PHP:
<a href="javascript: document.frmMessage.submitAction.value='action=download&fileName=<?php echo $message['path']; ?>'; document.frmMessage.submit();">
							<?php echo $message['attachment'];	?>				
							</a>

$message['path'] = de filename die wordt gegenereerd met md5 en zo weggeschreven naar de databank. In de databank staan 2 zaken:
De originele bestandsnaam (deze wordt getoond op de pagina) en path (de bestandsnaam gemaakt via md5. Ik doe dit vooral om duplicaten tegen te gaan). Het bestand dat wordt geupload heeft de naam gemaakt via md5.

dJeez

Legacy Member
Probeer eens met het volgende :
PHP:
header("Cache-Control: cache, must-revalidate");   
header("Pragma: public");
header("Content-Type: " . $mime_type);
header("Content-Length: " . $size); 
header("Content-Disposition: attachment; filename=\"".$name."\";");
header("Content-Transfer-Encoding: binary");
readfile(DOCUMENT_PATH . $folder . $name); 
exit;
Uiteraard wel aan te passen waar nodig hé...

Forceert sowieso download popup op IE 6, IE 7 en FF (net getest voor alle zekerheid :p). Het zou wel kunnen dat IE 5.X tegenstrubbelt aangezien die nogal eens problemen durfde geven bij Content-Disposition: attachment; maar de hack die dat oplost staat in de eerste post van de thread.

omfg

Legacy Member
SveltestSword zei:
omfg (warhead.be) heeft zo een functie in z'n cms geloof ik, ik zal hem er eens op wijzen (als ie dees topic al nie zelf ziet) of die niet kan helpen...
idd, ik gebruik
PHP:
		header('Content-Type: application/force-download');
		header('Content-Type: application/octet-stream');
		header('Content-Disposition: attachment; filename="'.$file.'";');
		header('Content-Length: '.filesize($folder.$file));
		readfile($folder.$file);

hier een vb van een html pagina, hier een vb van een .jpg
grtz

McBr@in

Legacy Member
Ok, ik heb jullie code eens geprobeerd, en nadat ik in men php.ini output buffering had aangezet kon ik de bestanden downloaden. Maar het volgende probleem nu is, dat het gedownloade bestand ook delen layout bevat van mijn site. Dit komt door de manier hoe ik link naar de bestanden.

PHP:
<a href="javascript: document.frmMessage.submitAction.value='action=download&fileName=<?php echo $message['path']; ?>'; document.frmMessage.submit();">

Hij past dus de download niet enkel toe op het bestand (fileName) maar ook op de form waarin de link staat. Enige suggestie hoe ik de downloadlink anders kan opbouwen?

Tyfius

Legacy Member
Goh, het zit heel ver weg, maar ik heb tijdens mijn vakantiewerk eens hetzelfde probleem gehad en ik ben toen gaan sleutelen met ob_start() en ob_flush() enzo, en zo heb ik dat volgens mij opgelost gekregen.

McBr@in

Legacy Member
Vind het niet met die ob_start en flush. Pff, begint tegen te steken :D

dJeez

Legacy Member
Als er een deel van de output van uw script in het gedownloade bestand komt te zitten wijst dat doorgaans op het ontbreken van een exit; nadat je de inhoud van het bestand hebt doorgestuurd. Check wat ik hierboven heb gepost.

McBr@in

Legacy Member
Wel dit is hoe het nu gebeurd:

PHP:
if($action == "download")
        {
           
            $path = "C:\attachments/";
            $full_file_name = $path.$fileName;
            $len = filesize($full_file_name);
               $content_type = file_get_mime_type($fileName);
            header("Cache-Control: cache, must-revalidate");  
            header("Pragma: public");
            header("Content-Type: " . $content_type);
            header("Content-Length: " . $len);
            header("Content-Disposition: attachment; filename=\"".$fileName."\";");
            header("Content-Transfer-Encoding: binary");
            readfile($path.$fileName);
           
            exit;
             
              
        }?>

Dus ik gebruik wel een exit denk ik :p

dJeez

Legacy Member
Waarom werk je eigenlijk via een form? En hoe zit die form zelf in elkaar (doet die een POST of GET)?

Waar zit dat stuk layout precies in het gedownloade bestand (vooraan of achteraan)?

McBr@in

Legacy Member
Het stuk zit vooraan. En dan volgt de inhoud van het bestand er gewoon onder.
Zit ammel beetje dynamisch in elkaar e. Berichten lezen en aanmaken gebeuren allemaal op dezelfde pagina. Maar als het niet werkt ga ik gewoon bestanden zippen bij het uploaden en automatisch unzippen bij het downloaden. En zo werkt het wel.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan