file image php scarica per codice

Questo riguarda il download di file con PHP

La mia versione php è 5.3.5 e il mio apache è 2.2.17

Sto cercando di scaricare i file (pdf, jpg, tiff) che ho caricato sul mio server e che scaricano con la stessa dimensione e tipo, ma non riesco a vederli. Immagino che non siano copiati correttamente. Ma quando apro gli originali caricati funzionano perfettamente. Ho visto quasi tutte le domande che sono apparse come suggerite e nessuna di esse ha risposto alla domanda, solo una simile è questa , ma ancora non risponde alla mia domanda.

per scaricare sto usando questo codice

header("Content-type: application/force-download"); header('Content-Disposition: inline; filename="' . $dir . '"'); header("Content-Transfer-Encoding: Binary"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); header("Content-length: ".filesize($dir)); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . $file . '"'); readfile("$dir"); 

where $dir="62756d616769636e63/646973736572746174/ehddggh/1.JPG" e $file="1.JPG"

qualcuno può darmi un suggerimento su cosa sto facendo male, o darmi una soluzione migliore per scaricare i file?

Questo odora di come stai ricevendo contenuti extra (spuriosi) nei tuoi file scaricati.

Assicurati di non avere intestazioni della BOM, spazi o altro prima dei tag PHP aperti nei tuoi file; inoltre, che non hai spazi vuoti finali o altri dati dopo la chiusura dei tag PHP (se chiudi i tuoi tag PHP).

Inoltre, ripulisci un po 'il tuo codice: perché più intestazioni Content-Type ? Perché più intestazioni Content-Disposition ?

 readfile($dir); // without the quotes? 

Inoltre, assicurati che $ dir esista effettivamente

is_file($dir) o file_exists($dir)

Grazie a tutti per le risposte. Stavo chiamando il download come una function in un file con altre funzioni, quindi alla fine ho dovuto scrivere uno script da solo, a parte altri file. Il mio problema era che avevo bisogno che fosse sicuro e di scaricare un file solo se apparteneva all'utente e l'utente era loggato, quindi invio tutti i dati di cui ho bisogno, cifrato e all'interno dello script uso una serie di cose per vedere se il proprietario è davvero l'utente registrato. Quindi se qualcuno vuole sapere questo è il codice che ho usato e funziona perfettamente.

 <?php session_start(); $a=$_GET['a']; $parts=explode("-",$a); $tres=$parts[0]; $nombre=$partes[1]; $dbcodletra=substr($tres,2); if($dbcod!=$_SESSION["username"])$boolt=0; if($ext==1) $extl=".jpg"; if($ext==2) $extl=".jpeg"; if($ext==3) $extl=".tif"; if($ext==4) $extl=".tiff"; if($ext==5) $extl=".pdf"; if($ext==6) $extl=".doc"; if($ext==7) $extl=".docx"; if($tipoproy==1) $dir="rute/".$dbcodletra."/".$nombre.$extl; if($tipoproy==2) $dir="rute/".$dbcodletra."/".$nombre.$extl; if($tipoproy==3) $dir="rute/".$dbcodletra."/".$nombre.$extl; if($tipoproy==4) $dir="rute/".$dbcodletra."/".$nombre.$extl; if (file_exists($dir) && $boolt) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($dir)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($dir)); ob_clean(); flush(); readfile($dir); exit; }else echo "<meta http-equiv=\"Refresh\" content=\"0;url=misdocumentos.php\">"; ?> 

Pagandolo in una domanda di due anni …

Ho riscontrato un problema simile con download corrotti che non potevano essere aperti (quando si fa clic con il button destro del mouse e si salva, come funzionava perfettamente). Dopo aver letto la risposta di @ Jon , ho pensato che fosse a qualcosa. Se guardate i documenti per readfile (collegati sotto), vednetworking un ob_clean (), un flush () e un'output nel loro esempio. Tutti quelli ridurranno al minimo la perdita di dati di carattere extra nella risposta. Ho appena copiato il loro esempio n. 1 e il mio problema è stato risolto.

http://php.net/readfile

Le intestazioni appaiono disordinate, prova solo a fare questo:

 header('Pragma: public'); header('Cache-Control: public, no-cache'); header('Content-Type: application/octet-stream'); header('Content-Length: ' . filesize($dir)); header('Content-Disposition: attachment; filename="' . basename($dir) . '"'); header('Content-Transfer-Encoding: binary'); readfile($dir);