如何将上传的图片从 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 时设置为 auto
或 native
,然后 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>?