Hallo,


Met dit script probeer ik afbeeldingen te downloaden, maar als ik ze open, krijg ik een foutmelding en worden ze niet weergegeven. Ik krijg alleen de melding "Dit bestand kan niet worden geopend.".


<?php
        header ('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header ('Content-Description: File Transfer');
        header ('Content-Type: application/octet-stream');
        header ('Content-Length: ' . filesize(__DIR__ .'/opslag/'.$_GET['bestand']));
	header('Content-Type: image/png');		
	header("Content-Disposition: attachment; filename=".$_GET['bestand']."");

?>
Waar is de inhoud van je bestand? Heb je dat voor het voorbeeld weggelaten of ben je het gewoon vergeten?
Ben van Velzen op 28/05/2016 13:23:41

Waar is de inhoud van je bestand? Heb je dat voor het voorbeeld weggelaten of ben je het gewoon vergeten?


Dan is dat dus het probleem. :P
Hoe krijg ik de inhoud?
Voeg dit eens toe:
<?php
fpassthru(__DIR__ . '/opslag/' . $_GET['bestand']);
?>

Het is overigens aan te bevelen om niet direct op de inhoud van $_GET['bestand'] te vertrouwen, het is in deze opzet een koud kunstje om ieder gewenst bestand op je systeem op te vragen. Bijvoorbeeld de inhoud van index.php, welke weer verwijst naar configuraties e.d.
Ben van Velzen op 28/05/2016 14:18:22

Voeg dit eens toe:
<?php
fpassthru(__DIR__ . '/opslag/' . $_GET['bestand']);
?>

Het is overigens aan te bevelen om niet direct op de inhoud van $_GET['bestand'] te vertrouwen, het is in deze opzet een koud kunstje om ieder gewenst bestand op je systeem op te vragen. Bijvoorbeeld de inhoud van index.php, welke weer verwijst naar configuraties e.d.


Helaas. Inhoud blijft leeg.
zet je error reporting eens aan en haal de headers weg, wat krijg je dan?
Ben van Velzen op 28/05/2016 21:13:37

zet je error reporting eens aan en haal de headers weg, wat krijg je dan?



Warning: fpassthru() expects parameter 1 to be resource, string given in /home/blablabla/domains/mijndomein.nl/public_html/upload/download.php on line 4


Ik neem aan, dat het gaat om dit stukje : '/opslag/'
Marco Eilander op 28/05/2016 12:35:06


<?php
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Content-Description: File Transfer');
	header('Content-Type: application/octet-stream');
	header('Content-Length: ' . filesize(__DIR__ .'/opslag/'.$_GET['bestand']));
	header('Content-Type: image/png');		
	header("Content-Disposition: attachment; filename=".$_GET['bestand']."");
?>



Bij de header 'Content-Length' zit het bestand in de map 'opslag'. Bij de header 'Content-Disposition' niet.


<?php
	header("Content-Disposition: attachment; filename=".__DIR__ ."/opslag/".$_GET['bestand']."");
?>

En dat is niet relevant. De content disposition mag zelfs geen mapnamen hebben. Doe dit eens:
<?php
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize(__DIR__ .'/opslag/'.$_GET['bestand']));
header('Content-Type: image/png');
header("Content-Disposition: attachment; filename=".$_GET['bestand']);
readfile(__DIR__ . '/opslag/' . $_GET['bestand']);
?>
My 2c:
- in bestandsnamen kunnen spaties zitten, zet daartoe dubbele quotes om filename, oftewel:
<?php
header('Content-Disposition: attachment; filename="'.$fileName.'"');
?>

- voeg een exit-statement aan het einde toe om te voorkomen dat er verder nog output geproduceerd wordt wat het bestand mogelijk kan corrumperen
Ik denk, dat het toch op één of ander manier corrupt wordt.
Er komt nu wel data in het bestand te staan als ik het open, maar ik blijf de melding krijgen, dat het bestand niet geopend kan worden in de windows 10 app -> Foto's.

Dit heb ik nu:


<?php
	$filename = $_GET['bestand'];
	$ext = explode(".",$filename);
	if($ext[1] == 'png'){
		header('Content-Type: image/png'); 
	}
	if($ext[1] == 'jpg'){
		header('Content-Type: image/jpg'); 
	}
	if($ext[1] == 'jpeg'){
		header('Content-Type: image/jpeg'); 
	}	
	if($ext[1] == 'gif'){
		header('Content-Type: image/gif'); 
	}
	if($ext[1] == 'bmp'){
		header('Content-Type: image/bmp'); 
	}	
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Length: ' . filesize(__DIR__ .'/opslag/'.$filename));       
	header('Content-Disposition: attachment; filename="'.$filename.'"');
    readfile(__DIR__ . '/opslag/' . $filename);
	exit();
?>


UPDATE

Ik had notepad++ op UTF-8 staan, nu ik het op ANSI heb gezet, werkt het! :)

Reageren