Отображение изображений blob в папке внутри

Я использую PrimeFaces 3.2 на JBoss 7.1.1.

Я пытаюсь показать изображение, которое хранится в BLOB в базе данных MySQL в . Изображение сохраняется в byte[] а затем преобразуется в StreamedContent следующим образом:

 InputStream stream = new ByteArrayInputStream(ingredient.getImage()); ingredient.setJsfImage(new DefaultStreamedContent(stream, "image/jpg")); 

Затем я пытаюсь отобразить его в Facelet следующим образом:

  

...

Однако при загрузке страницы я получаю следующую ошибку в JBoss:

SEVERE [org.primefaces.application.PrimeResourceHandler] (http-127.0.0.1-8080-12) Ошибка в streamовой передаче динамического ресурса.

Как это вызвано и как я могу его решить?

Вы должны понять, что фактически отображает элемент только с URL-адресом, который затем затем индивидуально вызывается веб-браузером, когда он собирается проанализировать полученную разметку HTML и представить результаты.

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

Например

    

Если бэк-бэк-брейк Images может выглядеть так:

 @ManagedBean @ApplicationScoped public class Images { @EJB private ImageService service; public StreamedContent getImage() throws IOException { FacesContext context = FacesContext.getCurrentInstance(); if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { // So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL. return new DefaultStreamedContent(); } else { // So, browser is requesting the image. Return a real StreamedContent with the image bytes. String id = context.getExternalContext().getRequestParameterMap().get("id"); Image image = service.find(Long.valueOf(id)); return new DefaultStreamedContent(new ByteArrayInputStream(image.getBytes())); } } } 

Или, если вы уже используете OmniFaces 2.0 или новее , подумайте о том, чтобы использовать его который можно использовать более интуитивно, почти так же, как вы ожидали. Смотрите также блог на эту тему.

Смотрите также:

  • Отображение динамического изображения из базы данных с помощью p: graphicImage и StreamedContent

Я не понимаю, зачем вам это нужно. Вы можете просто создать сервлет, который получит изображение из базы данных с отображением «/images/yourimage.jpg».

Вот краткое руководство с соответствующим кодом в нем о том, как это сделать.

JSF – отображение изображений из базы данных в JSF

Благодаря BalusC. Я сделал это, установив целое число в бэк-компоненте и присвоив ему значение diffent при обновлении ByteArray для изображения. Это целое число служит уникальным идентификатором изображения. Затем я устанавливаю это целое число как значение внутри на странице.

тег изображения выглядит

    ` 

и установление изображения в фоновом режиме в качестве

  if(user.getPicture()!=null){ imageId = (int) new Date().getTime(); BinaryStreamImpl bs = new BinaryStreamImpl(user.getPicture()); //picture is byte[] property in user class this.image = new DefaultStreamedContent(bs.getInputStream(), "image/png"); } 

Теперь он работает хорошо.

Вы должны иметь в виду, что компонент graphicImage отображается на странице. Он отображает элемент HTML . В браузере будет выполнен запрос для страницы JSF, после чего последующие запросы будут также выполняться для каждого изображения на странице.

Эти изображения поступают из сервлета ресурсов PrimeFaces, а не FacesServlet, что означает, что область действия управляемого компонента и его свойства, вероятно, неприменимы.

Попробуйте сначала загрузить blob в массив байтов, и это, вероятно, начнет работать.

EDIT: см. Мой следующий ответ на этот похожий вопрос. графическое изображение, не отображающее streamовое содержимое в Primefaces

 InputStream is = new ByteArrayInputStream((byte[]) yourBlobData); myImage = new DefaultStreamedContent(is, "image/png"); 

на странице jsf;

  

mmm I 99% уверен, что не работает с ui: повторите, у вас будет много проблем с этим (потому что я сделал XD), я рекомендую вам создать сервлет и служить изображениям в качестве входного streamа (есть множество примеров).

Давайте будем гением компьютера.