Fornitura di documenti all'esterno della cartella radice Web.

Ho una function chiamata "viewDoc" che dovrebbe andare in una cartella al di fuori della web root e recuperare un file per me. Funziona bene con le immagini (Jpgs ecc.) Ma con i PDF mostra solo una pagina grigia vuota come mostrato qui – http://www.tutorplanner.com/userimage/viewdoc/12787622467.pdf

Qualcuno può vedere cosa sto sbagliando perché mi sono graffiato la testa per un giorno!

public function viewDoc($doc) { $path_parts = pathinfo($_SERVER['REQUEST_URI']); $file = $doc; $fileDir = '/var/uploads/'; if (file_exists($fileDir . $file)) { $contents = file_get_contents($fileDir . $file); //print_r($contents); header('Content-Type: ' . mime_content_type($fileDir . $file)); header('Content-Length: ' . filesize($fileDir . $file)); readfile($contents); } } 

readfile viene utilizzato con il parametro di un nome file – NON text.

Due esempi che functionrebbero (file_get_contents):

 public function viewDoc($doc) { $path_parts = pathinfo($_SERVER['REQUEST_URI']); $file = $doc; $fileDir = '/var/uploads/'; $filePath = $fileDir . $file; if (file_exists($filePath)) { $contents = file_get_contents($filePath); header('Content-Type: ' . mime_content_type($filePath)); header('Content-Length: ' . filesize($filePath)); echo $contents; } } 

o (readfile):

 public function viewDoc($doc) { $path_parts = pathinfo($_SERVER['REQUEST_URI']); $file = $doc; $fileDir = '/var/uploads/'; $filePath = $fileDir . $file; if (file_exists($filePath)) { header('Content-Type: ' . mime_content_type($filePath)); header('Content-Length: ' . filesize($filePath)); readfile($filePath); } } 

Ho anche aggiunto la variabile $filePath per te, poiché non c'è motivo di concatenare la string più volte.

modificare

Come ulteriore sicurezza, al commento di Yazmat, puoi usare $file = str_replace(arrays('..', '/'), '', $doc); dato che questo rimuoverà tutti i riferimenti ad altre directory (tuttavia, con la barra rimuoverà anche l'accesso alle sottodirectory, quindi potresti saltarlo, dipende dal tuo codice e dalla struttura del file).

Hai un grosso problema di sicurezza qui, chiunque può accedere a qualsiasi cosa sul tuo server con la function che hai scritto. Ti consiglio vivamente di non usarlo e di mettere i tuoi file (che dovrebbero essere accessibili) in una directory web pubblica.