Храним изображения в базе данных MySQL + php

Прежде всего помните, что у метода хранения изображений в базе данных есть свои плюсы и минусы.
+ Файлы проекта хранятся централизовано (что особенно хорошо при командной разработке).
+ Доступ к файлам в любом случае будет осуществляться через скрипт-загрузчик, что дает возможность более гибко контролировать этот процесс.

— Доставка файла скриптом из БД будет с большей вероятностью проходить медленнее чем апачем из файловой системы.
— В целом дамп БД будет слишком большим и, возможно, репликация будет требовать широких каналов между удаленными серверами. Также такой дамп будет трудно читаем по F3, т.к. бинарные данные будут смешаны с другими данными.

Ну а после эдакого вступления приступим к кодированию.
Прежде всего будем считать, что начальным источником изображения является локальный файл. Откроем его и считаем информацию. После чего добавим её в базу, вычитаем из базы и выведем на экран.

<?php
$fileName = "77525-1920x1080.jpg";  //имя файла
$f = fopen($fileName,"r");   //открываем файл
$read = fread($f,filesize($fileName));  //считываем содержимое
fclose($f);  //закрываем файл
$conn = mysql_connect("localhost", "name", "password");  //соединяемся с сервером базы данных ! введите свои данные
mysql_select_db("my_db");  //выбираем базу данных
$img = addslashes($read);  //приводим содержимое файла в пригодный для сохранения вид
$result = mysql_query("INSERT INTO imgs (img) VALUES('$img')",$conn);  //вставляем в базу данных новую запись
if ($result == 'true') {   //если всё прошло гладко запрашиваем строку и выводим на экран
    mysql_free_result($result);
    $sql = "SELECT * FROM imgs ORDER BY id DESC LIMIT 1";
    $result = mysql_query($sql);
    $row = mysql_fetch_assoc($result);
    $pic = $row["img"];
    mysql_free_result($result);
    ob_end_clean();  //очищает буфер вывода и отключает буферизацию вывода
    header("Content-Type: image/jpg");  //указываем браузеру что это изображение
    echo $pic;   //выводим данные
}
?>

При этом таблица imgs у меня имела такой вид:

CREATE TABLE `img` (
 `id` int(11) NOT NULL auto_increment,
 `img` blob,
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Примите во внимание, что таким образом сохранить выйдет только изображения до 2 Гб. Можно использовать LONGBLOB — 4 Гб, хотя врядли єто понадобится.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий