Перейти к содержимому

Как хранить изображения в базе данных

  • автор:

Как хранить фото для товара в БД?

Пишу интернет-магазин MVC Rest api с использованием Spring Boot , Hibernate , PostgreSQL . Мне необходимо иметь для товаров фотографии. Соответственно, отсюда вопрос как вообще это реализовать? Вариант с хранением картинок прямо в БД не подойдет, поэтому я решил хранить в БД ссылки на фото, которые у меня хранятся на жестком диске. Но как все это реализовать в коде? В Entity получается у меня поле с типом String ? Java:

private String image; 
alter table drink add column image varchar; 

А в БД столбец с ссылками (путь) к фото? В таком случае как вывести изображение на стороне клиента, ведь мне будет выдаваться не фото, а ссылка? Получается нужно писать некий метод, который будет до вывода находить файл по ссылке и выводить его? Но как?

Как хранить изображения в базе данных

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

Помог: 3 раз(а)

Секрет
Теперь, когда вы уже наверняка второпях отправили свой запрос,
я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
даже если первый ответ по теме последуем сразу же.

Само собой я знаю что ответят мне тут же, и если я посмотрю
на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
вопрос автора и еще два сообщение вида Ответ + Спасибо

После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..

Уверен что если бы я им сказал что у меня есть
фиолетовый квадрат, и нужно превратить его в синий треугольник
и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
но почему то кисточка не принимала цвет краски в банке,
то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
предложив её открыть, а не тратить еще стольник на жестянку.

Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.

На последок как оно происходит на форумах

Цитата:

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.

Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12

Как хранить изображения в базе данных

2 варианта — в базе или на диске. Какие аргументы за и против? Если на диске, то плюс — возможность доступа напрямую через веб-сервер. Будет ли отличаться скорость доступа при данных вариантах размещения (скорость поиска изображений в базе и на диске при большом кол-ве изображений)?

В отдельной SQL-базе
любой вариант кроме «в базе» — распухнет

еще один вариант — хранение изображений в облаке, сейчас это модно) Какие есть быстрые облака, как физически реализовать этот вариант?

(1) какие это дает преимущества?
(3) бред
за выборку в десятки секунд юзера замочат
(4) Все преимущества и ни одного недостатка
(6) как, например, через веб сервер напрямую получить изображение хранящееся в SQL-базе?

(6) да лан:
— увеличение трафика
— снижение скорости выборки
— потеря ссылочной целостности
— необходимость отдельного бэкапа
— снижение безопастности

хотя сам, конечно, даже версии объектов храню отдельно

Допустим кроме 1С есть сайт на котором нужны эти изображения.
(0) Если не предполагается массового селекта изображений, то пофигу.
(1) Согласен.
(2) Будто бы база не распухнет, если в неё BLOB-поля понапихать.
(10) предполагается при выгрузках. например на сайт
Потом, всё зависит от размера изображений, от их количества и от выполняемых с ними действий.
(12) что такое BLOB-поля?

(13) Транспорт для выгрузки какой будет — если FTP, то хранение в базе потребует каждое изображение прочитать из базы и записать в файл, а только после этого его отправить.

(15) В 1С это называют двоичные данные.

А кстати.. если хранить блобы в отдельной базе — можно ли обойтись для передачи данных туда-обратно без временных файлов? Есть ли возможность передачи двоичных данных через com?

(15) Большой Двоичный Объект.
(18) COM лицензию жрать будет

(18) BLOB-поля можно через COM-передавать, можно как блоки читать (ODBC-драйвер это умеет), а также, при желании, можно и сразу в FTP отправлять именно не файл, а данные из базы, но немного попрограммировать придётся.

(20) Ну, если вы под отдельной базой понимаете базу 1С, то да, но тут люди об SQL-базе говорят.

(0) Не уверен что два варианта
1. на диске
На диске сервера в сети 1С
На диске хостинга интернета и т.д.
Доступ:
Через
1. http
2. ftp
3. web-сервис

2. В базе
В какой? Может в базе mysql отдельного хостинга?
Лучше опишите Вашу задачу. Ведь все это можно подцепить к 1С.

В родной базе.

(23) Ну, ещё, как вариант, на самом хостинге и хранить — зачем их выгружать туда потом, если их можно сразу туда выгрузить.

(0) Лучше всего хранить на диске.
Преимущества:
1. Быстрый доступ
2. Простой доступ
3. При редактировании в фотошопе не нужно вытаскивать из базы, а потом обратно в базу заливать.
4. Можно смотреть изображения любой программой не умеющей работать с базой.
Недостатков нет.

(26) Недостатки проявляются только при переносе базы данных в другое место — картинки становятся надоступными, а также очень сложно организовать хранение версий картинок, так как нужно продумывать имена файлов.

(26) Вы наверное не имели дела с каталогами в 1000000 файлов, а еще бакап: полный, инкрементальный и пр. SQL самое то, доступ через сервер 1С

(0) Все зависит от задачи.
У нас и так и так хранятся.
На SQL тоже неплохо, даже пример есть
http://infostart.ru/public/67205/

(26) Лучше хранить в базе:
Преимущества:
1. Быстрый доступ.
2. Простой доступ из 1С.
3. Как правило, данные фотографии не нужно выкладывать в бложег и править в фотошопе.
4. Можно смотреть любой программой, а также средствами 1С, а также через Тонкий и Веб клиенты.
5. Централизованный бекап.
6. Настройка прав из 1С.
7. Возможность миграции по периферийкам.
Недостатки:

Это жрет лицензию 1С, но ведь мы с ней и работаем.

(28) Это так немного, особенно, если по папкам разложить.
Потом, если кто-то хранит на диске свои фотографии, то он с таким количеством картинок прекрасно знаком.

(31) Имел дело с МДаемоном, черта с два папку потом в проводнике откроешь.
(32) Проводник — это отдельная песня — он в каждый файл заглянет, что он там забыл, спрашивается.

(33) Сделать превьюшки, чебынет.

(0) Непростой вопрос. Сильно зависит от специфики и динамики.
В родной базе — отличный вариант. Но.
Если пихают много, толсто и часто, а читают наоборот — не очень часто (архивный вариант) и при этом стоимость потери этой информации не слишком велика — лучше на диске, чтобы не усложнять этой хней сопровождение основной базы.
В отдельной базе — идеальный вариант со всех сторон. И надежность нужную обеспечить не проблема и сопровождение основной базы не страдает. Но — реализовывать ручками.

Мда.. надо думать.
Сейчас в родной базе хранятся картинки, но хочется сделать вывод картинок в поле HTML документа для наглядного отображения сразу всех картинок товара. В случае хранения на диске это делается просто, а вот в случае хранения в базе нужно картинки сначала сохранить во временные файлы.

Как я могу хранить и извлекать изображения из базы данных 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 не будет возможности получить доступ к изображению.

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *