Как вставить загруженное изображение из p:fileUpload как BLOB в MySQL?

Как вставить загруженное изображение из p:fileUpload как BLOB в MySQL?

@Lob
@Column(name = "photo")
private byte[] photo;

И на странице XHTML я пишу это:

<p:inputText value="#{condidat.condidat.photo}" >
<p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"   
    allowTypes="*.jpg;*.png;*.gif;" description="Images"/>                       
</p:inputText>

Как я могу получить значение загруженного файла как byte[]?


person Abdennour TOUMI    schedule 29.11.2011    source источник
comment
Произошла ошибка: javax.validation.ConstraintViolationException: ограничение(я) проверки бина нарушено при выполнении автоматической проверки бина в событии обратного вызова: 'prePersist'. Подробности см. во встроенных ConstraintViolations.   -  person Abdennour TOUMI    schedule 29.11.2011
comment
Вы должны играть с StreamedContent, полученным от компонента fileUpload. У вас есть пример в витрине. Какую версию ПФ вы используете? Когда у вас есть streamedContent, вы можете вставить его в БД.   -  person spauny    schedule 29.11.2011


Ответы (2)


Вы можете получить содержимое загруженного файла через FileUploadEvent. В PrimeFaces 4.x с Apache Commons FileUpload или в PrimeFaces 5.x с параметром контекста primefaces.UPLOADER, установленным на commons, вы можете использовать UploadedFile#getContents() для получения загруженного файла как byte[].

public void handleFileUpload(FileUploadEvent event) {
    byte[] content = event.getFile().getContents();
    // ...
}

В PrimeFaces 5.x с параметром контекста primefaces.UPLOADER, отсутствующим или установленным на auto или native при использовании JSF 2.2, тогда getContents() вернет null, поскольку это не реализовано в NativeUploadedFile реализации. Вместо этого используйте UploadedFile#getInputStream(), а затем прочитайте из него байты, например. с помощью общего ввода-вывода.

public void handleFileUpload(FileUploadEvent event) {
    byte[] content = IOUtils.toByteArray(event.getFile().getInputstream());
    // ...
}

Наконец, просто установите этот byte[] в свою сущность и сохраните/объедините его.

Убедитесь, что вы установили тип кодировки формы на multipart/form-data и, при использовании Apache Commons FileUpload, что вы настроили фильтр загрузки файлов в web.xml согласно руководству пользователя PrimeFaces.

person BalusC    schedule 29.11.2011

Было бы полезно упомянуть, что мне пришлось использовать:

public void handleUpload(FileUploadEvent e) throws Exception {
    byte[] contents = IOUtils.toByteArray(e.getFile().getInputstream());
    //....
}

Кажется, что в PrimeFaces 5.x getContents() всегда возвращает null !

person Ahmad Abdelghany    schedule 02.03.2015