SpringMVC 存储 Base64
Posted
技术标签:
【中文标题】SpringMVC 存储 Base64【英文标题】:SpringMVC Storing Base64 【发布时间】:2013-01-17 16:56:57 【问题描述】:我有一个带有注册表单的 Spring MVC 应用程序。这个表格有一张base64数据格式的图片。我想将这些数据存储在数据库中。目前我将base64数据存储在一个输入元素中。我对此有几个问题;
我应该在什么 html 元素中保存 base64 数据目前我正在使用输入元素但是我在插入时遇到错误(Blob 是数据库和 Java 对象中使用的数据类型) -
Failed to convert property value of type java.lang.String to required type java.sql.Blob for property photo; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.sql.Blob] for property photo: no matching editors or conversion strategy found
或者有没有办法在java中将String转换为BLOB
即使数据是 base64 格式,我还需要在表单标签上使用 enctype="multipart/form-data" 吗?
如果 base64 数据存储在 html 文件元素中,我如何对其进行验证以检查它是否为 NULL?
【问题讨论】:
检查一下,如果有帮助 - mkyong.com/spring-mvc/spring-mvc-file-upload-example @Vinit Prajapati 这使用了一个文件对象,我想知道它对 base64 编码数据的工作方式是否相同。它不显示包含 base64 值的 html 元素。它也没有显示数据如何到达数据库。 【参考方案1】:您可以使用LobHelper
将其转换为Blob
。您从休眠会话 Session.getLobHelper()
中获取 LobHelper。
只要您没有<input type="file" />
,就不需要 enctype="multipart/form-data"。
验证应该像使用@NotNull 的普通字符串属性一样工作。
我个人不会将它编码存储。
【讨论】:
如果我不使用休眠,是否还有其他方法可以进行 blob 转换,或者无论如何都可以使用【参考方案2】:您可能已将 Blob 的 path
<form:input path="theBlobField">
不为 initBinder
中的 Blob 添加 PropertyEditor
,
这意味着,您正在尝试将 String 类型的值直接存储到 Blob 类型 - 瞧! IllegalStateException。
可能的方法是创建一个PropertyEditor
,将您的 Base64 编码字符串转换为 Blob 类型。
要解码编码的字符串,您可以使用 appache commons'Base64.decodeBase64
,它返回一个字节数组,然后将这些字节转换为 Blob
另一种解决方案是忘记路径,使用简单的<input name="photoData">
标签,然后在后端,只需使用request.getParameter("photoData")
即可获取base64 编码的字符串数据
还有一件事,如果事情不起作用,那么编码数据可能以mimeType
声明开头。要删除它,请使用
//@RequestParam data
//remove mimeType declaration in the data string first
String byteStr = data.split(",")[1];
//get the byte array of the data
byte[] bytes = Base64.decodeBase64(byteStr);
【讨论】:
以上是关于SpringMVC 存储 Base64的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot:从文件中提供图像 - 包含 base64 编码