如何将上传的图片从 p:fileUpload 插入 MySQL 中的 BLOB?

Posted

技术标签:

【中文标题】如何将上传的图片从 p:fileUpload 插入 MySQL 中的 BLOB?【英文标题】:How to insert uploaded image from p:fileUpload as BLOB in MySQL? 【发布时间】:2012-01-08 11:45:36 【问题描述】:

如何在 mysql 中将 p:fileUpload 上传的图片作为 BLOB 插入?

@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[]

【问题讨论】:

发生错误:javax.validation.ConstraintViolationException:对回调事件执行自动 Bean 验证时违反了 Bean 验证约束:'prePersist'。有关详细信息,请参阅嵌入式 ConstraintViolations。 您必须使用从 fileUpload 组件接收到的 StreamedContent。您在陈列柜中有一个示例。你用的是什么版本的PF?获得流式内容后,您可以将其插入 DB。 【参考方案1】:

您可以通过FileUploadEvent获取上传的文件内容。在带有 Apache Commons FileUpload 的 PrimeFaces 4.x 中,或者在上下文参数 primefaces.UPLOADER 设置为 commons 的 PrimeFaces 5.x 中,您可以使用 UploadedFile#getContents() 获取上传的文件为 byte[]

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

在 PrimeFaces 5.x 中,上下文参数 primefaces.UPLOADER 不存在或在使用 JSF 2.2 时设置为 autonative,然后 getContents() 将返回 null,因为那是 not implemented in NativeUploadedFile implementation。请改用UploadedFile#getInputStream(),然后使用read bytes from it, e.g. with help of commons IO。

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

最后,只需在您的实体中设置此 byte[] 并持久化/合并它。

确保您已将表单编码类型设置为 multipart/form-data,并且在使用 Apache Commons FileUpload 时,您已按照 PrimeFaces 用户指南在 web.xml 中配置了 file upload filter。

【讨论】:

【参考方案2】:

提及这一点可能会有所帮助,我不得不使用:

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

似乎在 PrimeFaces 5.x 中,getContents() 总是返回 null !

【讨论】:

以上是关于如何将上传的图片从 p:fileUpload 插入 MySQL 中的 BLOB?的主要内容,如果未能解决你的问题,请参考以下文章

如何在简单模式和 ajax="true" 中使用 <p:fileUpload>?

p:fileupload图像预览不起作用

上传图片并在codeigniter中插入文本

将上传的图片插入summernote编辑器

55bbs论坛上传图片,显示输入图片链接地址,找不到附件功能。

如何将word文本和图片一起上传