Как вывести изображение 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;
Комментариев нет:
Отправить комментарий