Как я загружаю изображение из DB в странице JSF с помощью управляемых компонентов?

У меня есть база данных с некоторыми изображениями. Кто-либо мог объяснить меня, как я мог загрузить изображение на странице JSF?

У меня уже есть управляемый компонент, который преобразовывает Объект изображения в streamcontent. Этот streamcontent называют от страницы в теге <h:graphicImage>, но когда я проверяю исходный код страницы, существует нет src где изображение могло быть загружено.

5
задан BalusC 17 May 2010 в 12:38
поделиться

1 ответ

JSF отображается как HTML элемент. Его атрибут src должен указывать на URL, а не на двоичное содержимое. Поэтому вы должны хранить URL (или хотя бы какой-то идентификатор в виде параметра запроса или pathinfo) в JSF bean и создать отдельный сервлет для потоковой передачи изображения из БД в HTTP-ответ.

Используйте это на странице JSF:

<h:graphicImage value="images/#{bean.imageId}">

Предполагая, что bean.getImageId() возвращает 123, это будет отображено в HTML так:

<img src="images/123">

Создайте класс Servlet, который отображается в web. xml на url-шаблон из /images/* и реализуйте его метод doGet() следующим образом. :

Long imageId = Long.valueOf(request.getPathInfo().substring(1)); // 123 (PS: don't forget to handle any exceptions).
Image image = imageDAO.find(imageId); // Get Image from DB.
// Image class is just a Javabean with the following properties:
// private String filename;
// private Long length;
// private InputStream content;

response.setHeader("Content-Type", getServletContext().getMimeType(image.getFilename()));
response.setHeader("Content-Length", image.getLength());
response.setHeader("Content-Disposition", "inline; filename=\"" + image.getFilename() + "\"");

BufferedInputStream input = null;
BufferedOutputStream output = null;

try {
    input = new BufferedInputStream(image.getContent());
    output = new BufferedOutputStream(response.getOutputStream());
    byte[] buffer = new byte[8192];
    int length;
    while ((length = input.read(buffer)) > 0) {
        output.write(buffer, 0, length);
    }
} finally {
    if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
    if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
}

В ImageDAO#find() вы можете использовать ResultSet#getBinaryStream() для получения изображения как InputStream из базы данных.

Расширенный пример можно найти в этой статье.

12
ответ дан 13 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: