Web

Как я могу хранить и извлекать изображения из базы данных MySQL с помощью PHP

Как я могу вставить изображение в MySQL, а затем получить его с помощью PHP?

У меня мало опыта в этой области и я хотел бы использовать небольшой код, чтобы начать разбираться в этом.

 

Ответ 1

Сначала вам необходимо создать таблицу MySQL для хранения изображений, например:

create table testblob (

    image_id          tinyint(3)      not null default '0',

    image_type      varchar(25) not null default '',

    image               blob             not null,

    image_size      varchar(25)  not null default '',

    image_ctgy      varchar(25)  not null default '',

    image_name    varchar(50) not null default ''

);

Затем вы можете поместить изображение в базу данных, например, так:

/***

* Все приведенные ниже команды MySQL_ могут быть легко...

 * переведены на MySQLi_ с дополнениями, как прокомментировано

 ***/ 

$imgData = file_get_contents($filename);

$size = getimagesize($filename);

mysql_connect("localhost", "$username", "$password");

mysql_select_db ("$dbname");

// mysqli 

// $link = mysqli_connect("localhost", $username, $password,$dbname); 

$sql = sprintf("INSERT INTO testblob

    (image_type, image, image_size, image_name)

    VALUES

    ('%s', '%s', '%d', '%s')",

    /***

     * Для всех функций mysqli_, приведенных ниже, синтаксис следующий:

     * mysqli_whartever($link, $functionContents); 

     ***/

    mysql_real_escape_string($size['mime']),

    mysql_real_escape_string($imgData),

    $size[3],

    mysql_real_escape_string($_FILES['userfile']['name'])

    );

mysql_query($sql);

Вы можете отобразить изображение из базы данных на веб-странице с помощью:

$link = mysql_connect("localhost", "username", "password");

mysql_select_db("testblob");

$sql = "SELECT image FROM testblob WHERE image_id=0";

$result = mysql_query("$sql");

header("Content-type: image/jpeg");

echo mysql_result($result, 0);

mysql_close($link);

 

Ответ 2

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

В то же время современные веб-серверы могут обслуживать изображения с помощью всего нескольких оптимизированных вызовов ядра (файл, отображенный в память, и в дальнейшем  передавая его TCP-стеку), так что они даже не копируют память, и накладных расходов почти нет. Это разница между возможностью обслуживать 20 или 2000 изображений параллельно на одной машине.

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

 

Ответ 3

Мое мнение таково: вместо того чтобы хранить изображения непосредственно в базе данных, рекомендуется хранить местоположение изображения в базе данных. Если сравнивать оба варианта, то хранение изображений в базе данных безопасно с точки зрения безопасности. Недостатками являются:

  1. Если база данных повреждена, нет возможности извлечь изображение.

  2. Извлечение файлов изображений из базы данных происходит медленно по сравнению с другими вариантами.

С другой стороны, хранение местоположения файла изображения в базе данных имеет следующие преимущества:

  1. Легко извлекать изображения.

  2. Если хранится более одного изображения, мы можем легко получить информацию о нем.

 

Ответ 4

Лично я не стал бы хранить изображение в базе данных, а поместил бы его в папку, недоступную извне, и использовал бы базу данных для отслеживания его местоположения. Это уменьшает размер базы данных, и вы можете просто включить ее с помощью PHP. Тогда без PHP не будет возможности получить доступ к изображению.

 

Схожие статьи

Чек-листы оптимизации сайта, продвижения сайта и готовности к запуску
Web

Чек-листы оптимизации сайта, продвижения сайта и готовности к запуску

Web

Что использовать: memcache или memcached?

Web

Что лучше использовать define() или const?

Web

Как получить имя переменной в виде строки в PHP?

×