3

我有一个带有注册表单的 Spring MVC 应用程序。这个表格有一张base64数据格式的图片。我想将这些数据存储在数据库中。目前我将base64数据存储在一个输入元素中。我对此有几个问题;

  1. 我应该在什么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

  2. 即使数据在base64中,我还需要在表单标签上使用enctype="multipart/form-data"吗?

  3. 如果base64数据存储在html文件元素中,我如何对其进行验证以检查它是否为NULL?

4

2 回答 2

1

您可以使用LobHelper将其转换为Blob. 您从休眠会话中获得 LobHelper Session.getLobHelper()

只要您没有<input type="file" />,就不需要 enctype="multipart/form-data"。

验证应该像使用 @NotNull 的普通字符串属性一样工作。

就我个人而言,我不会将它编码存储。

于 2013-02-03T11:08:50.543 回答
1

你可能已经把pathBlob 的 , 例如<form:input path="theBlobField">没有添加一个PropertyEditorfor Blobs 在你的initBinder,

这意味着,您正在尝试将 String 类型的值直接存储到 Blob 类型 - 瞧!非法状态异常。

可能的方法是创建一个PropertyEditor将 Base64 编码的字符串转换为 Blob 类型的方法。

要解码编码的字符串,您可以使用 appache commons'Base64.decodeBase64返回一个字节数组,然后将这些字节转换为 Blob

另一种解决方案是忘记路径,使用简单的<input name="photoData">标签,然后在后端,只需使用request.getParameter("photoData")which 获取 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);
于 2013-03-05T05:45:32.050 回答