Java 在H2数据库spring boot中存储图片
你好。我想在h2数据库中存储一个图像,然后在html页面中检索并显示相同的图像。我使用的是spring引导和文件上传方法,但是绑定结果中出现了错误 以下是页面/类: Category.javaJava 在H2数据库spring boot中存储图片,java,spring-mvc,spring-boot,thymeleaf,h2,Java,Spring Mvc,Spring Boot,Thymeleaf,H2,你好。我想在h2数据库中存储一个图像,然后在html页面中检索并显示相同的图像。我使用的是spring引导和文件上传方法,但是绑定结果中出现了错误 以下是页面/类: Category.java package com.vishal.project.entities; @Entity @Table(name="category") public class Category implements Serializable { private static final long serialVer
package com.vishal.project.entities;
@Entity
@Table(name="category")
public class Category implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="ID")
private Long id;
@Size(min=1, max=90)
@Column(name="CATEGORY_NAME")
private String CategoryName;
@Lob
@Column(name="CATEGORY_PHOTO")
private byte[] CategoryPhoto;
public Category(Long id, @Size(min = 1, max = 90) String categoryName, byte[] categoryPhoto) {
super();
this.id = id;
CategoryName = categoryName;
CategoryPhoto = categoryPhoto;
}
public byte[] getCategoryPhoto() {
return CategoryPhoto;
}
public void setCategoryPhoto(byte[] categoryPhoto) {
CategoryPhoto = categoryPhoto;
}
public Category() {}
@OneToMany(mappedBy = "category", cascade=CascadeType.ALL, orphanRemoval=true)
private Set<Book> Books = new HashSet<>();
public Set<Book> getBooks() {
return Books;
}
public void setBooks(Set<Book> books) {
Books = books;
}
public Long getId() {
return id;
}
public void setCategoryID(Long id) {
this.id = id;
}
public String getCategoryName() {
return CategoryName;
}
public void setCategoryName(String categoryName) {
CategoryName = categoryName;
}
@Override
public String toString() {
return "Category ID:" + id +
"Category Name:"+ CategoryName;
}
}
**最终更新:我收到此错误:*所需的请求部分“文件”不存在您始终可以做的是将工作文件上载与您的进行比较 另一件有助于将输入名称与控制器的方法(除文件外)的名称进行比较的事情 如果您发布的代码仍然相关,您可以在模板中的文件输入中找到名称“Fileimport”,但在控制器中,您需要文件(@RequestParam(value=“file”,required=false)) 帮助您调试的其他事项:
- 使用浏览器的开发工具,查看您通过网络发送的内容
- 在服务器端登录(以这种方式,或者对您来说太复杂,您可以简单地遍历参数名并记录它们(如果可能,还可以记录它们的值)
如果这对您没有帮助,那么请更新帖子:更新您的代码(模板+控制器,如果更改)并使用更好的stacktrace:on better我的意思是,您不仅应该显示stacktrace的最后N行,而且至少应该显示代码执行的第一行(换句话说,类名以您的包开头),如果第一个是由引起的,或者第二个是有意义的,则更好。Spring将上传的文件转换为对象,因此您无法将其直接映射到字节数组 可以使用从多部分文件获取字节数组 在本例中,您可以使用一个中间对象(如
CategoryForm
),其中字段CategoryPhoto
的类型为MultipartFile
。
然后,在您的控制器中,使用上面显示的方法将其映射到您已经拥有的
类别对象。嗨,您的ThymileAF表单解析如下:如果th:field属性存在,则删除name属性
<form class="form-horizontal" action="/categories/upload" method="post" enctype="multipart/form-data">
<input id="id" name="id" value="" type="hidden">
<div class="form-group">
<label class="col-sm-2 control-label">Category Name</label>
<div class="col-sm-10">
<input class="form-control" id="CategoryName" name="CategoryName" value="">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Category Photo</label>
<div class="col-sm-10">
<input name="CategoryPhoto" class="form-control" id="CategoryPhoto" type="file">
</div>
</div>
<div class="row">
<button class="btn btn-default">Save</button>
</div>
</form>
类别名称
分类照片
拯救
这清楚地说明了即使您在文件输入中提到name=“file”,也会得到错误,因为name标记后面提到th:field=“*{categoryPhoto}”,所以它被解析为name=categoryPhoto
使用th:value=“${product.name}”th:name=“name”th:id=“name”代替th:field将更灵活问题已经解决,请告诉您我在我的案例中做了什么:
1) 如果要在页面中上载一个文件,请使用Part file作为控制器方法中post映射的参数
2) 对于我的第二个问题,图像没有使用thymeleaf在html页面中呈现,因为我正在使用byte[]在数据库中持久化。所以它并没有被thymeleaf解决。因此,我使用Apache commons二进制编解码器Base64(可以作为Gradle或Maven依赖项添加)将我的byte[]图像转换为Base64字符串,这样它就可以由MyLeaf解析。
像这样:
Category category = categoryService.findbyID(id);
byte[] image = category.getCategoryPhoto();
String CatImage = Base64.encodeBase64String(image);
然后是HTML
<img th:src="@{'data:image/jpeg;base64,'+${Cimage}}" />
希望这对别人有帮助!!谢谢。您遇到了什么错误?例如,您可以使用multipart来完成。请不要发布错误图片。在您的问题中粘贴stacktrace或错误消息日志。要检索它,只需将该字节数组从数据库转换为Base64string,angular就可以直接读取它
,问题似乎在于您的对象需要一个字节[],但post是一个多部分文件。您应该创建一个CategoryTo对象,该对象上有您的验证注释,但只针对非文件字段。然后在控制器中创建一个具有验证值的新类别,然后执行c.setCategoryPhoto(file.getBytes())并将其持久化。因为表单字段和对象字段具有相同的名称,所以它试图转换,但看不到您试图表达的观点,但为什么因为我正在上载JPG文件而说必需的文件“不存在”。从您的回答来看,应该会出现类似对象无法映射之类的错误。我认为spring无法识别或找到我上载的文件。您对上一个示例做了哪些更改以获得此新错误?只是在我上载一个文件时,将控制器方法savecategory的参数从多部分文件更改为部分文件一次归档
Failed to convert property value of type 'org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile' to required type 'byte[]' for property 'CategoryPhoto'; nested exception is
java.lang.IllegalArgumentException: Cannot convert value of type 'org.springframework.web.multipart.support.
StandardMultipartHttpServletRequest$StandardMultipartFile' to required type 'byte' for property
'CategoryPhoto[0]': PropertyEditor [org.springframework.beans.propertyeditors.CustomNumberEditor] returned
inappropriate value of type 'org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile'
<form class="form-horizontal" action="/categories/upload" method="post" enctype="multipart/form-data">
<input id="id" name="id" value="" type="hidden">
<div class="form-group">
<label class="col-sm-2 control-label">Category Name</label>
<div class="col-sm-10">
<input class="form-control" id="CategoryName" name="CategoryName" value="">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Category Photo</label>
<div class="col-sm-10">
<input name="CategoryPhoto" class="form-control" id="CategoryPhoto" type="file">
</div>
</div>
<div class="row">
<button class="btn btn-default">Save</button>
</div>
</form>
Category category = categoryService.findbyID(id);
byte[] image = category.getCategoryPhoto();
String CatImage = Base64.encodeBase64String(image);
<img th:src="@{'data:image/jpeg;base64,'+${Cimage}}" />