Подтвердить что ты не робот

GWT - изображение из базы данных

Я действительно работаю на веб-сайте GWT. Теперь я зациклился на том, как я должен отображать изображения, хранящиеся в базе данных на моем веб-сайте.

В принципе, у меня есть байты в моей базе данных, которые я получаю с помощью hibernate. Теперь я должен, вероятно, создать... тег из этих данных, но я не знаю, как

Я использую GWT в Java и Hibernate

4b9b3361

Ответ 1

Вот решение. Сначала вы должны закодировать массив байтов, используя com.google.gwt.user.server.Base64Utils.toBase64 (byte []). Но этот метод не работает для IE 7. И IE8 имеет ограничение на 32 КБ.. IE9 не имеет этого предела.

вот метод на сервере

public String getImageData(){
      String base64 = Base64Utils.toBase64(imageByteArray); 
      base64 = "data:image/png;base64,"+base64;
      return base64;
}

Вот клиентский метод;

@Override 
public void onSuccess(String imageData) {     
    Image image = new Image(imageData);     
    RootPanel.get("image").add(image); 
} 

Ответ 2

Я не знаю, как работает GWT, хотя вы можете сопоставить сервлет/контроллер, который возвращает resourceStream. Например, если вы сопоставляете сервлет "imageViewer", который принимает параметр imageId, запрос на изображение станет

/imageViewer?imageId=1234

Объект Hibernate будет ссылаться на blob, поэтому вы можете вернуть его. Ссылка на пользовательский интерфейс будет

<img src="/imageViewer?imageId=1234"/>

Обновление. Возможно, вы не сможете использовать модель, поскольку она должна возвращать изображение, вам нужен явный контроллер или сервлет, который возвращает данные потока.
В сервлете вы сделаете что-то вроде

// get reference to input stream
InputStream in = hibnerateObject.getImage();  
// set MIME type etc
response.setContentType(mimeType);
OutputStream out = response.getOutputStream();
while ((len = in.read(buf)) >= 0)
 out.write(buf, 0, len);
in.close();
out.close();

Ответ 3

В GWT есть Виджет изображений. Вы не можете сделать это на стороне клиента, но вы можете позвонить RPC для связи с сервером. Тогда это просто приложение CRUD. На сервере подключитесь к базе данных с гибернацией и верните изображение клиенту или его URL-адрес, а на стороне клиента сделайте что-то вроде этого:

@Override
public void onSuccess(String imageUrl) {
    Image image = new Image(imageUrl);
    RootPanel.get("image").add(image);
}

@Override
public void onFailure(Throwable caught) {
    Window.alert(caught.getMessage());
}

Это все. Счастливое кодирование

Ответ 4

Я использовал тот же подход, что и предложенный Gursel Koca, но мог заставить его работать с использованием библиотеки Apache Base64, а не (по иронии судьбы) GWT Base64Utils

String base64 = Base64.encodeBase64String(array);
base64 = "data:image/"+type+";base64," + base64;
return base64;

Также обратите внимание, что если вы обновляете существующее изображение или место для замещения изображения, метод setURL перезапишет вашу таблицу стилей, поэтому сначала возьмите ее:

String styleName = profilePicture.getStyleName();
profilePicture.setUrl(base64String);
profilePicture.setStyleName(styleName);