Как я могу вставить изображение в 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
Мое мнение таково: вместо того чтобы хранить изображения непосредственно в базе данных, рекомендуется хранить местоположение изображения в базе данных. Если сравнивать оба варианта, то хранение изображений в базе данных безопасно с точки зрения безопасности. Недостатками являются:
Если база данных повреждена, нет возможности извлечь изображение.
Извлечение файлов изображений из базы данных происходит медленно по сравнению с другими вариантами.
С другой стороны, хранение местоположения файла изображения в базе данных имеет следующие преимущества:
Легко извлекать изображения.
Если хранится более одного изображения, мы можем легко получить информацию о нем.
Ответ 4
Лично я не стал бы хранить изображение в базе данных, а поместил бы его в папку, недоступную извне, и использовал бы базу данных для отслеживания его местоположения. Это уменьшает размер базы данных, и вы можете просто включить ее с помощью PHP. Тогда без PHP не будет возможности получить доступ к изображению.
Web