Страницы

Поиск по вопросам

суббота, 6 июля 2019 г.

Вывод blob-файла в браузер

Как вывести изображение blob из БД в браузер? Headers нельзя передать,поскольку до этого уже естественно была передана html-разметка. Додумался так : handler.php отправит нужные заголовки. Но как передать этому файлу саму картинку $data['image']. ??? Возможно эта реализация изначально неправильная. Кто-нибудь что-нибудь подскажет по этому поводу? update, @klopp, по-поводу если будет несколько картинок - в этой же таблице есть поле с html-кодом всей новости, там и img, и все остальное, а вопрос был по поводу едпинственной картинки, которая должна быть превьюшкой в каждой новости.


Ответ

Заранее скажу, что не считаю хорошей идеей хранить данные в blob в mysql. Однако, отвечаю именно на Ваш вопрос. Можно сделать с помощью nginx так, чтобы можно было обращаться к файлу как /img/filename.ext.
Локейшн в nginx
#переадресует обращения, например, с /img/land.png на handler.php?name=land.png location ~* ^/img/(.*)$ { try_files $uri /handler.php?name=$1; }
Допустим, есть таблица, где храниться имя файла, тип контента, и сам контент в blob_data
+----+--------------+----------+-----------+ | id | content_type | name | blob_data | +----+--------------+----------+-----------+ | 1 | image/png | land.png | 21K | | 2 | image/png | sky.png | 21K | +----+--------------+----------+-----------+
файл handler.php
if (!isset($_GET['name'])) notFound();
$conn = new PDO("mysql:host=mysql;dbname=test;", 'admin', 'admin'); $q = $conn->prepare('SELECT content_type, blob_data FROM test WHERE name=? LIMIT 1'); $q->execute([$_GET['name']]);
$q->bindColumn(1, $content_type, PDO::PARAM_STR, 256); $q->bindColumn(2, $blob_data, PDO::PARAM_LOB); $q->fetch(PDO::FETCH_BOUND);
if (empty($content_type)) notFound();
header("Content-Type: $content_type"); echo $blob_data;

Комментариев нет:

Отправить комментарий