Как хранить изображения на сервере
Для подключения этого механизма необходимо выполнить следующую настройку. Надо выбрать пункт меню Настройка — Параметры — Интеграция и выставить галочку Сохранять изображения на pix.netix.ru
Кроме снижения размеров базы данных, хранение изображений на сервере позволяет создать файл, в котором будут указаны наименование товара, артикул, ссылка на хранимое изображение и любые другие данные по товару. Обычно это требуется для выгрузки прайс-листов на различные торговые площадки.
Хранение изображений на сервере Нетикс — платная услуга. Об условиях подключения необходимо узнать в абонентском отделе компании Нетикс.
Для того, чтобы загрузить изображение товара или фотографию автомобиля, необходимо открыть, например, карточку товара, и нажать на кнопку
Ключевые слова для поиска: картинка, фотография, изображение, ссылка
Правильное хранение изображений на сервере
Подскажите пожалуйста, как осуществить механизм хранения изображений в файловой системе и ссылок на эти изображения в MySql? Желательно в деталях. И правильно ли хранить изображения на том же сервере, что и MySQL? Заранее спасибо.
- Вопрос задан более трёх лет назад
- 21734 просмотра
Комментировать
Решения вопроса 1
Можно хранить имя файла (good.jpg) и тип картинки (goods), например картинка товара, на основе этой информации строить путь, так, как вам угодно, например:
/media/origin/goods/g/go/good.jpg
/media/origin/goods/t/to/tovar.jpg
Если нужно сохранить картинку с таким же именем, то в конец дописываем индекс, например:
/media/origin/goods/g/go/good.jpg
/media/origin/goods/g/go/good__1.jpg
/media/origin/goods/g/go/good__2.jpg
Подпапки после типа картинки /g/go/ нужны, чтобы в одну директорию не сваливалось слишком много файлов.
Если в качестве имени файла используются цифры (напрмер — это индексы записей в базе), то подпапки лучше формировать с конца имени файла, например:
125.jpg -> /5/2/125.jpg
126.jpg -> /6/2/126.jpg
это позволит более равномерно распределять файлы по папкам.
Такой вариант позволит в будущем изменить место хранения картинок, поменять логику формирования пути к картинке, и т.д.
Закешированые картинки соответственно будут храниться, например, по такому пути /media/cached/goods//go/g/good.jpg
Пресет можно формировать, например, на основе ширины, высоты, способа масштабирования, и названия фильтра
Как правильно хранить изображения — в файлах или в базе данных MySQL?
На сайте планируется очень большое количество качественных изображений.
Около 2-х тысяч.
Я знаю, что изображения можно хранить в виде файлов на диске (привычный ранее способ) а также, при использовании CMS, в базе этой CMS, например MySQL.
Средний размер каждого файла порядка 3-х мегабайт.
Вопрос в том, какой способ выбрать.
Цели 2:
1. Ускорить работу сайта.
2. Хоть немного усложнить «работу» сайтопи$дам-вэбмастерам.
Если есть альтернатива, прошу. (Сайт планируется строить на Друпал 6.9)
- Блог
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Комментарии
olk 17 февраля 2009 в 0:08
Второй пункт не понял (как можно усложнить работу «сайтопи$дам-вэбмастерам», когда имидж в конечном счете будет на экране ?):) но с точки зрения производительности — однозначно в файловой системе (особено файлы такого размера)
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Однозначно рисунки выгоднее хранить в файловой системе. БД является узким местом каждого вебсайта.
По поводу защиты от сайтопиз. в. Существует возможность запретить доступ к рисункам не с вашего сайта с помощью .htaccess. Подробнее про это рассказать не могу — встречал недавно, но не могу вспомнить где именно.
Интересно ваше мнение.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Значит, файловая система.
Просто сейчас так много программ для копирования содержимого сайтов..
Придётся, видно, гадить копирайтом на каждой фотографии. Всё равно «выкачают».
А у нас не хватает ума как защитить файлы на сервере от тупого «выкачивания».
Спасибо, будем учиться. Это никогда не поздно
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Ветер 17 февраля 2009 в 2:05
Если будешь хранить в базе данных, то тебя хостер застрелит через пару секунд.
Разумное решение гадить копирайтом только если доступ к картинке пришел из вне.
А так как обычно боты скачивают, то запретить этим ботам доступ на сайт.
Тут вопрос в другом, для каких целей пользователь скачал картинки с сайта.
Для себя или для коммерческого использования.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Camor 17 февраля 2009 в 9:41
Можно конечно заморочиться и настроить elite xml website на вывод картинок друпала, но это достаточно сложно и не для всех сайтов потянет, хотя возможностей будет куча. Защиту от того, что бы не тоскали картинки можно сделать на уровне сервера или просто ставить watermark на картинки, что тоже полезно. Ещё есть способ, прописать в .htaccess защиту основанную на user-agent этих программ.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Для небольшого количества файлов (измеряя в тысячах) предпочтительно хранить на жестком диске мне кажеться. Но если измерять количество в миллионах то скорее всего лучше в базе данных, ведь если будет такое большое количество файлов то что станет с файловой системой ? А база данных в данном случае увеличиться в размерах но работать будет
Мое личное субъективное мнение.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
«_FeliX_» wrote:
Мое личное субъективное мнение.
Не верно. Просто проанализируйте для чего это делается. И хорошим примером будет служить тот факт, что социальные сети хранят в файлах. База вообще абсурд.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
«Camor» wrote:
Не верно. Просто проанализируйте для чего это делается. И хорошим примером будет служить тот факт, что социальные сети хранят в файлах. База вообще абсурд.
В полне возможно
Всеже правильность определяется задачей. Простым является стандартный способ хранения файлов. А для некоторых задач более подходят базы данных.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
От воровства контента не защититься никак.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Безусловно только в файловой системе.
От воровства контента защитится не так уж трудно.
Вот идеи:
1. В каталог с файлами ставится .htaccess запрещающий прямой доступ к файлам по HTTP
2. Картинки отдаются только через PHP-скрипты
3. В скрипты встроить защиту с лимитом скачиваний за минуту/час/день (кому как нравится) с конкретного IP.
4. Если не очень затратно по ресурсам, то можно этими же скриптами прилеплять к картинкам watermark с URL-сайта.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
От непосредственного скачивания имиджов защитится можно, но
глобальной защиты все таки не получится, я не зря написал (в первом комменте), что елси имидж уже на экране вашего компьютера, то он уже есть в кэше вашего браузера, а значит защитить его нельзя
а если вы не выдаете имидж на экран броузера, то зачем его держать на сервере .
Защита в виде watermark-ов — ну в принципе можно но особого смысла не вижу .
Единственная защита — юридическая, искать тех кто в обход ваших копирайтов использует ваш контент и предьявлять им претензии
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Всё зависит ещё от целей защиты!
Например у человека галерея в миллион картинок (ну пусть нескольких тысяч). Браузером такую галерею не вытянуть и за год! А вот роботом (если никакой защиты не стоит) это сделать можно быстро!
Опять же наличие watermark гарантирует, что не будет проблем с доказательством авторских прав на данное изображение, если например картинка выкладывается с правами «только смотреть», но с запретом на распространение, а недобросовестные пользователи на этот запрет плюют.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
1)От робота не защититься никак.
2)делать частотомерку для ip и куда её класть? посещаемый ресурс вполне себе может леч полежать. При этом — роботу вобще говоря спешить некуда — будет тянуть одну картинку в 3-4 секунды — и всё. за несколько суток стянется всё что угодно
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
1. С чего вы взяли? Помоему я уже написал как можно защитится
2. Частотомерку можно класть в БД (например MySQL). Посещаемый ресурс никуда лечь и полежать не ляжет. Тут всего-то надо при вызове страницы, выполнить два запроса: SELECT и UPDATE. Тот же Drupal выполняет десятки запросов к БД при вызове практически любой страницы и ещё никуда не лёг. Да, роботу спешить некуда, но после скажем 100 скачиваний в течении часа, ему придётся отдохнуть сутки. Вот и посчитайте сколько у такого робота займёт скачивание хотя бы 10 000 картинок. Таким образом ваши «несколько суток» превращаются в 100 дней. А если поумничать и ввести дополнительную обработку (скажем если двое суток подряд по 100 картинок, то в бан на неделю), то вообще период скачивания может растянуться на годы
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Спасибо всем давшим консультацию!
Файлы.. только файлы .. > база.. только база..
Значит, выбираем файлы.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Да простят меня коллеги, но файлы нужно хранить в БД, НО при этом копию в файловой системе.
Т.е. при обращении к файлу смотрится его наличие в файловой системе, если нет — создаем из БД копию в файловой системе, и при последующих обращениях уже в БД не лезем.
Но Drupal так не делает.
Зачем?
Файлы в внутри нод — это часть контента, хранение контента должно быть единообразно.
При переносе сайта достаточно просто перенести БД.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Ветер 2 апреля 2013 в 14:26
и получить охрененную нагрузку на базу.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Загрузка и хранение фотографий в Web приложениях
На современных web сайтах объем картинок может составлять от 30% до 70% всего размера страницы. Например, объем изображений на Хабре обычно составляет несколько мегабайт.
Большинство изображений в Web’e — это фотографии. Профильные фото в соц. сетях, альбом с телефона, профессиональные снимки и т.п. Правильная стратегия и инструменты для работы с фотографиями позволят сделать сайт быстрым для посетителей.
Формат для фотографий
Основной формат для хранения фотографий в Web’e — это JPEG. Однако иногда следует использовать и другие форматы.
JPEG
Хорошо подходит для сложных изображений, т.е. как раз для фотографий. Основной принцип сжатия в этом формате — это уменьшение качества путем уменьшения детализации изображения.
Подбор показателя сжатия может уменьшить размер исходного файла в несколько раз без заметного ухудшения качества. Логика такая: чем ниже качество — тем легче файл. Обычно используют показатель качества от 80 до 90.
Webp
Это формат, разработанный специально для обслуживания изображений в Web’e. Может уменьшить размер файла в несколько раз без потери качества. Значительно лучше сжимает фотки, чем JPEG. Однако поддерживается еще не всеми браузерами.
PNG и GIF
Эти форматы не подходят для фотографий. PNG изображения сохраняются без потери качества и лучше всего подойдут для иконок и графики. Формат GIF имеет ограниченную палитру, однако поддерживает анимацию.
Загрузка фотографий на сервер
Если на вашем проекте существует необходимость загружать пользовательские фотографии, сначала необходимо выбрать принцип их хранения на сервере.
Если вы собираетесь работать с сотнями файлов, стоит выбрать древовидную структуру:
Это позволит избежать ситуации с тысячами файлов в одной папке (это тормозит работу файловой системы и вашу собственную). Лучше всего использовать вложенную структуру из папок длинной в два символа:
$photo = $_FILES['image']['tmp_name']; $name = md5($photo) . '.jpg'; $dir = substr(md5(microtime()), mt_rand(0, 30), 2) . '/' . substr(md5(microtime()), mt_rand(0, 30), 2); $path = $dir . '/' . $name; # по этому пути сохраняем фотку
Инструменты
После загрузки фотографий на сервер, их следует обработать:
- Уменьшить размер до приемлемого. Нет смысла хранить и показывать оригинал фотографии размером 4000х3000 на сервере.
- Удалить все метаданные. Иногда объем такой инфы может составлять больше половины веса самого изображения.
- Провести оптимизацию для уменьшения размера файлов. Это ускорит загрузку у посетителя.
Для этого существует ряд инструментов.
ImageMagick
Сразу после загрузки фотографии на сервер, имеет смысл удалить все метаданные и изменить размер до 1000х1000:
# 90 - уровень сжатия в итоговом JPEG файле convert input.jpg -strip -resize 1000x1000 -quality 90 output.jpg
GraphicsMagick
То же самое с помощью более производительного GraphicsMagick:
# изменение размера до 600х500 с уровнем качества в 90 gm convert input.jpg -strip -resize 600x500 -quality 90 output.jpg
Jpegtran
Этот инструмент уменьшает размер JPEG файлов без потери качества.
jpegtran -copy none -optimize -outfile min.image.jpg image.jpg
cwebp
Утилита позволяет преобразовать изображение в формат Webp.
cwebp -q 85 input.jpg -o output.webp
Отдача клиенту
Фотографии лучше всего отдавать Nginx’ом. Обязательно нужно настроить Cache-control и Keepalive для повышения скорости загрузки страниц:
http < . keepalive_timeout 75s; server < listen 80; location ~ .\.jpg$ < expires max; >> >
Превью (thumbnails)
Часто нужно иметь возможность показывать небольшие версии фотографий (например, миниатюра профильной фотки).
Для этого необходимо генерировать нужные размеры при загрузке:
convert file.jpg -resize 50x50 file.s.jpg convert file.jpg -resize 250x250 file.m.jpg
Тогда у каждого изображения будет соответствующая миниатюра.
Более удобный подход — генерировать превью на лету с помощью, например, Nginx image_filter модуля.
Поддержка Webp
Webp не поддерживается всеми браузерами, однако постепенно набирает популярность. Для того, чтобы извлечь пользу из этого формата, можно отдавать разные версии фотографий в зависимости от браузера посетителя.
Для каждой фотографии нужно сгенерировать webp версию:
cwebp file.jpg -o file.jpg.webp
Теперь необходимо отдать соответствующую версию картинки в зависимости от поддержки этого формата браузером:
server < . location ~* ^/.+\.(jpg|jpeg)$ < if ($http_accept ~* "webp") < rewrite (.+) $1.webp; >> . >
Облака
Облачные технологии развиваются и дешевеют. Если у вас нет специфических задач по обработке фоток, лучше присмотреться к варианту использования внешнего сервиса для их хранения и отдачи.
Amazon s3
Это облачное хранилище с которым не придется думать о масштабировании. Храните терабайты и не парьтесь. Пример реализации загрузки фотографий на S3 в PHP:
$path = 'photo_name.jpg'; $s3 = new S3('ключ', 'секрет'); $s3->putObjectFile($_FILES['image']['tmp_name'], 'букет', $path, S3::ACL_PUBLIC_READ, []);
После этого можно показывать фотку прямо с Амазона:
.
.
Cloudinary
Мощный сервис для работы с фотографиями в облаке. Ресайз, кроп, распознавание лиц, разные форматы, онлайн редактор и другие функции.
i.onthe.io
Мега простой сервис, распознает возможности браузера и подбирает оптимальный формат отдачи. Поддерживает URL API для ресайза и кропа.
Конспект
- Правильный формат и сжатие фоток могут сэкономить до 70% объема страницы.
- Используйте только JPEG для фотографий.
- При возможности включайте поддержку Webp.
- Imagemagick, Graphicsmagick и Jpegtran для манипуляций и оптимизации фоток.
- Рассматривайте облачные решения для хранения фоток — это быстро и удобно.