Как я могу хранить и получать изображения из базы данных MySQL, используя PHP? - PullRequest
58 голосов
/ 28 октября 2009

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

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

Ответы [ 6 ]

121 голосов
/ 28 октября 2009

Сначала вы создаете таблицу 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 ''
);

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

/***
 * All of the below MySQL_ commands can be easily
 * translated to MySQLi_ with the additions as commented
 ***/ 
$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')",
    /***
     * For all mysqli_ functions below, the syntax is:
     * 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);
22 голосов
/ 27 мая 2012

Вместо хранения изображений в базе данных храните их в папке на диске и сохраняйте их расположение в базе данных.

9 голосов
/ 04 декабря 2009

Помните, что обслуживание изображений из БД обычно намного, намного намного медленнее, чем их передача с диска.

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

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

Это разница между возможностью одновременной подачи 20 или 2000 изображений на одном компьютере.

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

6 голосов
/ 19 июня 2013

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

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

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

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

  1. Легко получить.

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

6 голосов
/ 04 декабря 2009

Я также рекомендую подумать об этом, а затем выбрать сохранение изображений в вашей файловой системе, а не в БД. см. здесь: Хранение изображений в БД - да или нет?

4 голосов
/ 20 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...