У меня есть функция под названием «viewDoc», которая должна перейти в папку вне корня веб-сайта и получить файл для меня. Он работает нормально с изображениями (Jpgs и т. Д.), Но с PDF-файлом он выводит только пустую серо-страницу, как показано здесь – http://www.tutorplanner.com/userimage/viewdoc/12787622467.pdf
Может ли кто-нибудь увидеть, что я делаю неправильно, поскольку я прочесываю голову над этим в течение дня!
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 используется с параметром имени файла – NOT text.
Два примера, которые будут работать (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; } }
или (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); } }
Я также добавил переменную $filePath
для вас, так как нет причин для последовательного перевода строки несколько раз.
редактировать
В качестве дополнительной безопасности для комментария Yazmat вы можете использовать $file = str_replace(array('..', '/'), '', $doc);
поскольку это приведет к удалению всех ссылок на другие каталоги (однако с помощью косой черты он также удалит доступ к вспомогательным каталогам, поэтому вы можете пропустить это, зависящее от вашего кода и структуры файла).
Здесь у вас большая проблема с безопасностью, каждый может получить доступ к чему-либо на вашем сервере с помощью функции, которую вы написали. Я действительно советую вам не использовать его и просто помещать ваши файлы (которые должны быть доступны) в общедоступный веб-каталог.