我有一个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
OR有没有办法将字符串转换为java中的BLOB
我还需要使用enctype =" multipart / form-data"在表单标签上甚至认为数据是在base64中?
如果base64数据存储在html文件元素中,我该怎样对其进行验证以检查它是否为NULL?
答案 0 :(得分:1)
您可以使用LobHelper
将其转换为Blob
。你从休眠会话Session.getLobHelper()
获得了LobHelper。
只要您没有<input type="file" />
,就不需要enctype =“multipart / form-data”。
验证应该与@NotNull的普通String属性一样。
我个人不会存储它。
答案 1 :(得分:1)
您可能已将Blob的path
放入,例如<form:input path="theBlobField">
,但未在PropertyEditor
initBinder
这意味着,您尝试直接将String类型的值存储到Blob类型 - 瞧! IllegalStateException异常。
可能的方法是创建一个PropertyEditor
,将Base64编码的String转换为Blob类型。
要对已编码的String进行解码,您可以使用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);