Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Вывод картинки в браузер


Автор: The_Aleksey 27.12.2012, 16:25
Всем привет!

Начну издалека...
Есть сайт, где любой зашедший пользователь может загрузить файл, причем только графический. Структура сайта такая, что файлы грузятся в папку, которая лежит на одном уровне с public_html (папкой с файлами сайта). С загрузкой никаких проблем нет, но встает задача отображения загруженного файла в браузере, зная его абсолютный путь, и с тем именем, с которым оно было загружено.
Пока только нашел на php.net следующее решение
Код

<?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');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>

Тут все классно, но файл предлагается скачать, а мне нужно, чтобы выводился в браузере, с тем именем с которым загружен, т.е. код вида
Код

<img src="get_image.php?id=5" />

мне не подойдет.
Может быть у кого уже было такое, поделитесь мыслями

Автор: Fortop 27.12.2012, 16:41
header('Content-Disposition: attachment; filename='.basename($file));

Вот это отвечает за то имя, под которым файл будет скачиваться

Автор: The_Aleksey 27.12.2012, 16:43
Это я понимаю, но мне не нужно, чтобы файл предлагалось скачать, а нужно, чтобы он просто вывелся в браузер, и если я правой кнопкой на него нажал, то там вывелось бы его реальное имя

Автор: ksnk 27.12.2012, 18:04
The_Aleksey, Не пробовал, но, imho, может сработать.
Если сайт на юниксовом хостинге, то можно сохранять с тем именем, как пришло от пользователя. Нужно только убедиться, что имя файла в utf-8 и не содержит несовместимой с файловой системой грязи. Соответственно ссылка формируется как
src=".htmlentities(urlencode($filename), ENT_QUOTES)" или с каким подвывертом - можно посмотреть в http://php.net/manual/en/function.urlencode.php


Автор: Fortop 27.12.2012, 19:03
mod_rewrite или его аналоги
и вперед.

Под каким именно именем сохранен файл не имеет значения.

Автор: Aliance 28.12.2012, 10:08
Разве за призыв браузер к скачиванию не отвечает заголовок application/octet-stream и если заменить его на, скажем, image/png то будет выводится картинка.

Автор: The_Aleksey 28.12.2012, 10:48
Спасибо всем за ответы! В общем сейчас получилось пока следующее

.htaccess
Код

RewriteBase /
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ image.php?filename=$1 [L,QSA]


image.php
Код

<?php
    $filename = substr($_GET['filename'], strrpos($_GET['filename'], "/")+1);
    $ext = substr($filename, strrpos($filename, "."));
    $file = '/home/tra-la-la/'.$filename;
    
    if (file_exists($file)) 
    {
        header('Content-Type: image/jpeg');
        header('Content-Disposition: inline; filename='.basename($file));
        header('Content-Length: ' . filesize($file));
        readfile($file);
    }
?>

content-type пока для тестирования задан жестко, в дальнейшем в зависимости от $ext, я его буду менять.

Т.е. если папки images и соответствующего файла в ней не существует (а это заведомо так, т.к. такой папки вообще нет), то передаем имя файла в GET переменной, и там уже дальше его обрабатываем. И если в браузере вбить прямой адрес картинки, то все OK, но если вставить адрес в тег img
Код

<img src="/images/filename.jpg" />

то HTTP/1.1 404 Not Found...

Автор: The_Aleksey 28.12.2012, 11:18
тестировал в denwer на винде, загрузил на unix-хостинг, там все отлично работает, видимо какие-то особенности, которые в общем уже не так важны)
Еще раз всем спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)