2012-05-25 3 views
0

На моем сайте; пользователи могут загружать свои фотографии. Я использую tomcat с apache, hibernate, jpa.Где я должен хранить файлы, загруженные пользователями на моем сервере?

Я бы предпочел, чтобы эти изображения были в каком-то месте, например, /var/ImagesUploaded на моей ubuntu. С помощью Java я могу ссылаться на эти файлы в каталоге /var/ImagesUploaded, используя java.io, но как я могу показать эти изображения на HTML-страницах пользователю? В HTML-файлах нам нужны теги, такие как <img src=''>, и этот src относится к webapp. Так вот, я должен держать загруженные пользователем изображения внутри моего webapp ТОЛЬКО! Или есть лучшее решение?

ответ

1

Как насчет чтения изображений в приложении, а затем служить их вашему пользователю в качестве потока с кодировкой base64? Таким образом, вам не нужно открывать каталог изображений в Интернете и эффективно предотвращать его сканирование с помощью ботов.

  1. Прочитайте файл как InputStream внутри приложения с помощью java.io
  2. конвертировать его в Base64 с помощью Apache Commons Codec. encodeBase64URLSafeString(IOUtils.toByteArray(yourImageAsInputStream);
  3. в ответе HTML, вставлять изображение как <img src="data:image/jpeg;base64,encodedString">

This пост на SO может быть полезным.

1

Либо настройте свой веб-сервер на серверные файлы с /var/imagesUploaded (например, /imguploads), либо используйте скрипт, который читает изображение и выводит его пользователю, с правильными заголовками.

+1

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

+0

biziclop: На данный момент только проверки, которые я делаю, это размер, расширения и ручная модерация (если файл является файлом для взрослых и т. Д.). Вы имели в виду, что мы должны проверить, был ли пользователь загружен файл с расширением .jpg; это действительно действительный файл jpeg, а не некоторый js-файл? Можете ли вы предложить какой-либо общий способ обработки нескольких расширений? – Deepak

+0

Konerak: Можете ли вы объяснить, что вы подразумеваете под сценариями? Как определить тег при отправке ответа HTML? Также я использую apache перед tomcat. Не могли бы вы помочь мне настроить его? – Deepak

0

У вас есть несколько вариантов:

  1. Если вы на Tomcat 7, вы можете использовать "псевдоним" функцию в вашем <Context> элемент (http://tomcat.apache.org/tomcat- 7.0-doc/config/context.html # Standard_Implementation)

  2. Вы можете попытаться сопоставить DefaultServlet по специальному пути, например «/ uploads/*», но имейте в виду, что некоторые версии Tomcat имеют DefaultServlet, которые в основном делают не работает должным образом, если он не отображается на "/"

  3. Вы можете написать собственный сервлет, чтобы обслуживать биты самостоятельно, но в конечном итоге вы дублируете множество возможностей DefaultServlet и можете не соответствовать категории надежности (например, реализации запросов диапазона, и т.д.)

Обратите внимание, что если вы пишете свой собственный сервлет, у вас есть возможность выполнения пользователя на основе проверки для санкционированного доступа к определенным ресурсам. Возможно, вы не хотите, чтобы весь каталог загрузок был доступен, скажем, в Google.

Смежные вопросы