Получить изображение из blob через Hibernate (не JDBC)

Я нашел очень хорошее решение для получения изображений из db/blob благодаря Как получить и отобразить изображения из базы данных на странице JSP?

Но это решение, использующее JDBC-соединение для каждого запроса изображения.

Я использую Spring 3 аннотации и Hibernate 3.

Я попытался сделать подобную вещь с помощью моего "imageService", который был автообновлен аннотацией в классе ImageServlet, но я получил nullPointerException, а это значит, что функция imageService не задана методом Injection Dependency.

Есть ли способ решить это? Я не люблю делать одно соединение jdbc на запросе изображения.

Ответы

Ответ 1

Я надеюсь, что вы храните изображение в таблице как тип BLOB (если не пытайтесь это сделать, так как это лучшая практика). Допустим, что у вас есть класс Person с image человека, хранящегося в БД. Если вы хотите сопоставить это, просто добавьте свойство в лицо POJO, которое содержит изображение.

@Column(name="image")
@Blob
private Blob image;

Когда вы его отобразите, преобразуйте его в byte[] и покажите.

private byte[] toByteArray(Blob fromImageBlob) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
      return toByteArrayImpl(fromImageBlob, baos);
    } catch (Exception e) {
    }
    return null;
  }



private byte[] toByteArrayImpl(Blob fromImageBlob, 
      ByteArrayOutputStream baos) throws SQLException, IOException {
    byte buf[] = new byte[4000];
    int dataSize;
    InputStream is = fromImageBlob.getBinaryStream(); 

    try {
      while((dataSize = is.read(buf)) != -1) {
        baos.write(buf, 0, dataSize);
      }    
    } finally {
      if(is != null) {
        is.close();
      }
    }
    return baos.toByteArray();
  }

Вы можете увидеть приведенные ниже примеры, чтобы узнать больше об этом.

Как вы можете видеть, есть несколько способов сделать это. Выберите подходящий для вас вариант.