Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在H2数据库spring boot中存储图片_Java_Spring Mvc_Spring Boot_Thymeleaf_H2 - Fatal编程技术网

Java 在H2数据库spring boot中存储图片

Java 在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

你好。我想在h2数据库中存储一个图像,然后在html页面中检索并显示相同的图像。我使用的是spring引导和文件上传方法,但是绑定结果中出现了错误

以下是页面/类:

Category.java

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}}" />