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

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

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

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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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