2008-09-29 8 views
2

Я разрабатываю веб-приложение с использованием Struts 2.1.2 и Hibernate 3.2.6.GA. У меня есть объект, User, который я сопоставил с таблицей USERS в БД, используя Hibernate. Я хочу иметь изображение, связанное с этой сущностью, которую я планирую хранить как BLOB в БД. Я также хочу отображать изображение на веб-странице вместе с другими атрибутами User.Как я могу показывать изображение в браузере с помощью Struts 2 + Hibernate 3?

Решение, которое я мог придумать, состоял в том, чтобы иметь стол IMAGES(ID, IMAGE), где IMAGE - столбец BLOB. USERS будет иметь столбец FK под названием IMAGEID, который указывает на таблицу IMAGES. Затем я буду отображать свойство на объекте User, которое называется imageId, сопоставленное с этим IMAGEID как длинное. При рендеринге страницы с помощью JSP я бы добавил изображения как <img src="images.action?id=1"/> и т. Д., И у вас есть действие, которое считывает изображение и передает содержимое в браузер, при этом заголовки должны кэшировать изображение в течение длительного времени.

Будет ли это работать? Есть ли лучший подход для рендеринга изображений, хранящихся в БД? Сохраняет ли такие изображения в БД правильный подход в первую очередь?

ответ

4

Да, ваше предлагаемое решение будет работать. Учитывая, что вы работаете в среде Java, сохранение изображений в базе данных - лучший способ. Если вы работаете в одной серверной среде с сервером приложений, который позволит вам развернуть в разобранном формате технически, вы можете хранить изображения на диске, но это не будет лучшей практикой. Одним из предложений было бы использовать сервлет вместо JSP. Чтобы получить хорошее поведение в браузере, браузер должен думать, что тип файла, который он отображает, соответствует типу файла, который он ожидает. Несмотря на наличие заголовков типа mime, расширение файла по-прежнему очень важно. Итак, вы хотите ссылку, которая выглядит следующим образом:

<a href="foo.jsp"><img src="imageservlet/123456789.png"></a> 

Где 123456789 первичный ключ вашего изображения в базе данных. Ваше отображение сервлета будет выглядеть следующим образом:

<servlet> 
    <servlet-name>ImageServlet</servlet-name> 
    <servlet-class>com.example.ImageServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>ImageServlet</servlet-name> 
    <url-pattern>/imageservlet/*</url-pattern> 
</servlet-mapping> 

Затем сервлет просто разобрать URL запроса для изображения ID, а не с помощью строки запроса в строке запроса будет ввести в заблуждение некоторых браузеров.Использование строки запроса не будет нарушать браузеры напрямую, но вы получите странное поведение в отношении кеширования, и некоторые браузеры могут сообщать о содержании как небезопасное.

0

Если вы хотите отобразить изображение пользователя напрямую со своими свойствами, возможно, вы можете рассмотреть возможность встраивания данных изображения непосредственно в HTML.

Используя специальные данные: схема URL вы можете вставлять любые данные мимические внутри HTML-страницы, формат выглядит следующим образом:

data:<mimetype>;base64,<data> 

потребности быть заменены мима Тип ваших данных (например, image/png) и - это закодированная в base64 строка фактических байтов файла.

См. RFC 2557.

Example:

<img src="data:image/png;base64,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"> 
+0

Я просто прочитал, что это не работает с IE, пока не будет выпущена версия 8. Кроме того, изображение не кэшируется в браузере. Поэтому, несмотря на простоту кодирования, я думаю, что буду использовать свою оригинальную схему. – 2008-09-30 03:05:03

+0

также помните, что существует (действительно строгий) предел длины такой строки. От 1 тыс. Символов до 100 тыс. В зависимости от браузера. – 2011-12-28 14:33:24

0

Internet Explorer не поддерживает этот стиль вложения изображения.

+0

Просто протестировал http://rifers.org/blogs/gbevin/2005/4/11/embedding_images_inside_html с IE7, и он работает отлично. – 2008-09-29 23:18:21

0

Ваше предлагаемое решение будет работать отлично. Я сделал то же самое.

Но для этого вам не нужен сервлет. У Struts2 уже есть результат потока.

См. Это Struts 2 Example, который описывает именно то, что вы хотите.

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

  • Нет связанных вопросов^_^