Могу ли я «эхо» изображения .jpg через php без его обработки?

Представьте себе следующее:

<img src="/image.php?image=5.jpg" /> 

Теперь, в image.php :

 header('content-type: image/jpeg'); $image = imagecreatefromjpeg($_GET['image']); imagejpeg($image,NULL,100); 

Это работает, но таким образом сценарий загружает изображение, обрабатывает его, а затем повторяет его. Можно ли это сделать без обработки изображения?

Причина, по которой я хочу это сделать, заключается в том, что я не хочу, чтобы люди знали, где находятся изображения, поэтому я не хочу писать полный путь в атрибут img src.

Мне просто нужно отправить необработанные изображения в браузер, но не показывая их истинное местоположение.

Да, ты можешь. Просто readfile вместо imagecreatefromXXX + imagejpeg .

 header('Content-Type: image/jpeg'); $src = /* process $_GET['image'] to recover the path */; readfile($src); 

Процесс /* process $_GET['images'] to recover the path */ part подразумевает любую дезинфекцию, которую вам нужно делать на входе, чтобы избежать того, что кто-то запрашивает запрещенный файл. Если ваш ввод скрипта является файловым путем, это может означать проверку из предопределенного списка, удаление возможных разделителей каталогов, проверку на регулярное выражение и т. Д. Другим способом было бы хранить пути внутри базы данных и передавать сценарию простой идентификатор и восстановите путь к файлу. Это может быть лучшей идеей, так как пользователи не будут упоминать о каком-либо пути к файлу на URL-адресе сценария (если вы просто передаете путь, люди могут фактически угадать, где находятся файлы, и это то, что вы пытаетесь предотвратить).

Конечно, используя readfile . Не забудьте ограничить имена разрешенных изображений. В противном случае вы создадите уязвимость обхода каталога .

 header('content-type: image/jpeg'); $img = preg_replace('/[^0-9a-z\._\-]/', '_', $_GET['image']); readfile($img); 

Что-то вроде http://www.php.net/manual/en/function.readfile.php

Из примера

 <?php $file = 'monkey.gif'; if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); 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($file)); ob_clean(); flush(); readfile($file); exit; } ?>