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 编码

spring springmvc 注解的总结和归纳

spring springmvc 注解的总结和归纳

MongoDB:存储的base64缓冲区数据和检索的base64不匹配

spring mvc配置文件不能识别是啥原因?

为啥mongodb以base64的形式存储二进制数据?