Я пишу приложение, которое позволяет пользователям загружать изображения на сервер. Я ожидаю около 20 изображений в день в формате jpeg и, вероятно, без редактирования / изменения размера. (Это другой вопрос, как изменить размер изображений на стороне сервера перед сохранением. Может быть, кто-нибудь может добавить ресурс .NET для этого в комментарии или около того). Теперь мне интересно, где лучше всего хранить загруженные изображения.
Сохраните изображения в виде файла в файловой системе и создайте запись в таблице с точным путем к этому изображению.
Или сохраните само изображение в таблице, используя тип данных «изображение» или «двоичные данные» сервера базы данных.
Я вижу преимущества и недостатки в обоих. Мне нравится а), потому что я могу легко перемещать файлы, и мне просто нужно изменить запись в таблице. С другой стороны, мне не нравится хранить бизнес-данные на веб-сервере, и я действительно не хочу подключать веб-сервер к любому другому источнику данных, который содержит бизнес-данные (по соображениям безопасности). Мне нравится б) потому что вся информация в одном месте и легко доступны по запросу. С другой стороны, база данных очень скоро станет очень большой. Передать эти данные на аутсорсинг будет сложнее.
Ответы:
Я обычно храню файлы в файловой системе, потому что это то, для чего она там, хотя есть исключения. Для файлов файловая система является наиболее гибким и производительным решением (обычно).
Есть несколько проблем с хранением файлов в базе данных - файлы, как правило, намного больше, чем средняя строка - наборы результатов, содержащие много больших файлов, будут занимать много памяти. Кроме того, если вы используете механизм хранения, который использует блокировку таблиц для записи (например, ISAM), ваша таблица файлов может часто блокироваться в зависимости от размера / скорости файлов, которые вы там храните.
Что касается безопасности - я обычно храню файлы в каталоге, который находится за пределами корня документа (недоступен через HTTP-запрос), и обслуживаю их через скрипт, который сначала проверяет правильность авторизации.
источник
Единственное преимущество варианта B - наличие всех данных в одной системе, но это ложное преимущество! Вы можете возразить, что ваш код также является формой данных и, следовательно, также может храниться в базе данных - как бы вы этого хотели?
Если у вас нет уникального случая:
Для хранения файлов необязательно использовать файловую систему. Вместо этого вы можете использовать облачное хранилище (например, Amazon S3 ) или инфраструктуру как услугу поверх него (например, Uploadcare ):
https://uploadcare.com/upload-api-cloud-storage-and-cdn/
Но хранить файлы в базе данных - плохая идея.
источник
Я знаю, что это старый пост. Но многие посетители этой страницы не получают ничего, связанного с этим вопросом. Специально для новичка.
Как загружать и хранить изображения или файлы на нашем сайте:
Для статического веб-сайта, возможно, нет проблем, поскольку файловое хранилище для некоторого общего хостинга все еще достаточно. Проблема возникает из-за динамического веб-сайта, когда он становится больше. Можно обрабатывать большие файлы в базе данных, но большие файлы, такие как изображения, становятся проблемой. На веб-сайте есть два типа изображений:
Изображения поступают от администратора динамического блога. Обычно эти изображения оптимизируются перед загрузкой.
Изображения от пользователей в случае, если пользователям разрешено загружать изображения, такие как аватар. Или пользователи могут создавать контент для блога и размещать изображения из текстового редактора. Такого рода изображения сложно предугадать размер. Пользователи могут загружать большие изображения только для небольшого содержимого, изменяя размер представления, но не изменяя размер изображения.
Путем игнорирования пункта № 1 выше, быстрое решение для позиции № 2 можно временно решить с помощью следующих советов, если на нашем веб-сайте нет функции оптимизатора изображений:
Не позволяйте пользователям загружать файлы напрямую из текстового редактора, перенаправляя их в галерею изображений. На этой странице пользователи должны загрузить файл заранее, прежде чем они смогут встроить его в контент. Этот метод называется файловым менеджером.
Используйте функцию обрезки изображения, чтобы пользователи загружали изображения. Это ограничит размер изображения, даже если пользователи загружают очень большие файлы. Окончательное изображение является результатом обрезанного изображения. Мы можем определить размер на стороне сервера и принять только, например, 500 КБ или меньше.
Теперь это только временно. Для окончательного решения вопрос повторяется:
Что мы можем тогда сделать:
Миграция с виртуального хостинга VPS. Недостаточно? Затем еще больше, перейдя на Dedicated.
Создайте свой собственный сервер для хранения файлов. Погуглить, чтобы это сделать. Это не так сложно, как вы думаете. Некоторые люди делают это для своего сайта.
Самый простой способ - использовать службу хранения файлов CDN.
Хорошо, 1 и 2 немного дороже. Но № 3 я считаю лучшим решением.
Некоторые сервисы CDN позволяют хранить сколько угодно веб-файлов.
Вопрос "как с нашего сайта загрузить файл в CDN?"
Не волнуйтесь, как только вы зарегистрируетесь, обычно бесплатно, вы получите руководство, как загрузить файл и получить ссылку с / на ваш сайт. Вы получите API и многое другое. Это просто.
Некоторые провайдеры предоставляют нам бесплатную услугу в течение 14 дней с ограниченным объемом памяти и пропускной способностью. Но это будет нормально для отправной точки. Единственная проблема в том, что «люди никогда не пробуют».
Надеюсь, это поможет новичку.
источник
У нас были клиенты, которые настаивали на варианте B (хранилище базы данных) несколько раз на нескольких разных серверах, и в конечном итоге мы всегда возвращались к варианту A (хранилище файловой системы).
Такие большие большие двоичные объекты просто не обрабатывались достаточно хорошо даже SQL Server 2005, который является последним из тех, что мы опробовали.
В частности, мы видели серьезное раздувание и, я думаю, проблемы с блокировкой.
Еще одно замечание: если вы используете хранилище на основе NTFS (сервер Windows и т. Д.), Вы можете подумать о том, чтобы найти способ разместить тысячи и тысячи файлов в одном каталоге. Я не уверен, почему, но иногда файловая система не справляется с этой ситуацией. Если кто-то знает об этом больше, я хотел бы это услышать.
Но я всегда стараюсь использовать подкаталоги, чтобы немного разбить вещи. Для этого часто подходит дата создания:
Изображения / 2008/12/17 / .jpg
... Это обеспечивает приличный уровень разделения, а также немного помогает при отладке. Клиенты Explorer и FTP могут немного задохнуться, когда каталоги действительно огромны.
РЕДАКТИРОВАТЬ: Небольшое примечание на 2017 год, в более поздних версиях SQL Server есть новые параметры для обработки большого количества BLOB, которые должны избегать недостатков, которые я обсуждал.
РЕДАКТИРОВАТЬ: краткое примечание для 2020 года, хранилище BLOB-объектов в AWS / Azure и т. Д. Также было вариантом в течение многих лет. Это отлично подходит для многих веб-проектов, поскольку это дешево и часто может упростить некоторые проблемы, связанные с развертыванием, масштабированием до нескольких серверов, отладкой других сред, когда это необходимо, и т. Д.
источник
ls
это сделать, это займет вечность (зависает). Или удалите.Недавно я создал приложение PHP / MySQL, которое хранит файлы PDF / Word в таблице MySQL (до сих пор размером 40 МБ на файл).
Плюсы:
Минусы:
Я бы назвал свою реализацию успешной, она учитывает требования к резервному копированию и упрощает структуру проекта. Производительность устраивает 20-30 человек, использующих приложение.
источник
Я использую загруженные изображения на своем веб-сайте и определенно скажу вариант а).
Еще одна вещь, которую я настоятельно рекомендую, - это немедленно изменить имя файла с того, что пользователь назвал фотографии, на что-то более управляемое. Например, что-то с датой и временем для однозначной идентификации каждого изображения.
Это также помогает удалить из имени файла пользователя все странные символы, чтобы избежать осложнений в будущем.
источник
Определенно измените размер изображения и проверьте его формат, если можете. Были случаи, когда вредоносные файлы загружались и обслуживались невольными хостами - например, уязвимость GIFAR позволяла скрыть вредоносный Java-апплет в файле GIF, который затем мог бы читать файлы cookie в текущем контексте и отправлять их на еще один сайт для атаки межсайтового скриптинга. Изменение размера изображений обычно предотвращает это, поскольку изменяет встроенный код. Хотя эта атака была исправлена патчами JVM, наивное обслуживание двоичных файлов без их очистки открывает вам целый ряд уязвимостей.
Помните, что большинство антивирусных сканеров могут работать только с файловой системой - если вы храните свои двоичные файлы в БД, вы не сможете легко запустить сканер против них.
источник
Это в основном я.
id
которое будет храниться в базе данных для любой строки / документа вместе сimage file name
(или может иметь произвольное имя в качестве имени изображения).path
если она не существует. Например 2016/08/21. Запомните этот путь и сохраните в базе данных для того же документа и строки.id
папку с изображениями вpath
папку. (Папка пути может находиться в папке / var / web-content.)Когда вам нужно получить доступ к любому изображению, упомянутому в документе, у вас есть путь и идентификатор папки, которая содержит изображения. Например
/var/web-content/{{path}}/{{id}}/image-file-name.sm.jpg
Таким образом, если вам нужно удалить все обработанные файлы изображений, просто удалите папку и ее содержимое рекурсивно.
источник
В SQL Server 2008 есть своего рода гибридный подход, называемый типом данных файлового потока , о котором говорилось на RunAs Radio # 74 , который является своего рода лучшим из обоих миров. У большинства людей нет версии 2008 года, но если у вас есть, этот вариант выглядит довольно круто.
источник
Большинство реализаций - это вариант А.
С вариантом B вы открываете целую банку whoop4ss, когда собираете эти биты из базы данных во что-то, что может быть отображено в браузере ... Кроме того, если db не работает, изображения недоступны.
Я не думаю, что пространство - это слишком большая проблема ... Терабайтные диски сейчас стоят пару сотен долларов.
Мы реализуем вариант А, потому что у нас нет времени или ресурсов для реализации варианта Б.
источник
Для автоматического изменения размера попробуйте imagemagick ... он используется для многих основных систем управления контентом / фотографиями с открытым исходным кодом ... и я считаю, что для него есть некоторые расширения .net.
источник
Мы используем A. Я бы поместил его на общий диск (если вы не планируете запускать более одного сервера).
Если придет время, когда это не будет масштабироваться для вас, вы можете изучить механизмы кеширования.
источник
Абсолютно, положительно, вариант А. Другие отмечали, что базы данных обычно плохо справляются с большими двоичными объектами, независимо от того, предназначены они для этого или нет. С другой стороны, файловые системы живут ради этого. У вас есть возможность использовать чередование RAID, распределять образы по нескольким дискам, даже распределять их по географически разрозненным серверам.
Еще одно преимущество заключается в том, что резервное копирование / репликация вашей базы данных будет чудовищным.
источник
Вариант А.
После загрузки изображения вы можете проверить формат и изменить его размер перед сохранением. На http://www.codeproject.com есть несколько примеров кода .Net для изменения размера изображений . Например: http://www.codeproject.com/KB/cs/Photo_Resize.aspx
источник
По соображениям безопасности также рекомендуется избегать проблем, вызванных анализом содержимого IE, который может позволить злоумышленникам загружать JavaScript внутри файлов изображений, которые могут выполняться в контексте вашего сайта. Таким образом, вы можете захотеть как-то преобразовать изображения (обрезать / изменить их размер) перед их сохранением, чтобы предотвратить такого рода атаки. У этого ответа есть и другие идеи.
источник
Ну, у меня есть аналогичный проект, где пользователи загружают файлы на сервер. На мой взгляд, вариант а) - лучшее решение, так как он более гибкий. Что вам нужно сделать, так это хранить изображения в защищенной папке, классифицированной по подкаталогам. Главный каталог должен быть настроен администратором, так как контент не должен запускаться скриптами (очень важно) и (чтение, запись) защищен, чтобы он не был доступен в HTTP-запросе.
Я надеюсь, это поможет вам.
источник
Если это небольшие файлы, которые не нужно редактировать, вариант B - неплохой вариант. Я предпочитаю писать логику для хранения файлов и решения безумных проблем со структурой каталогов. Имея много файлов в одном каталоге плохо. емкай?
Если файлы большие или требуют постоянного редактирования, особенно в таких программах, как офис, то вариант А - ваш лучший выбор.
В большинстве случаев это вопрос предпочтений, но если вы выберете вариант A, просто сделайте так, чтобы в каталогах не было слишком много файлов. Если вы выберете вариант B, то сделайте таблицу с данными в формате BLOB в ее собственной базе данных и / или группе файлов. Это поможет с обслуживанием, особенно резервным копированием / восстановлением. Ваши обычные данные, вероятно, довольно малы, в то время как данные вашего изображения со временем будут огромными .
источник
Это зависит от ваших требований, особенно от объема, пользователей и частоты поиска. Но для малого или среднего офиса лучшим вариантом является использование таких приложений, как Apple Photos или Adobe Lighroom. Они специализируются на хранении, каталогизации, индексировании и организации такого рода ресурсов. Но для крупных организаций с высокими требованиями к хранению и большим количеством пользователей рекомендуется создать экземпляр платформы управления контентом с помощью системы управления цифровыми активами, например Nuxeo или Alfresco; оба предлагают очень хорошие ресурсы, действительно управляют очень большими объемами данных с помощью упрощенных методов их получения. И, что очень важно: для обеих платформ есть бесплатный вариант (с открытым исходным кодом).
источник