Spring,Hibernate:尝试保存图像时出现无效的 UTF-8 起始字节 0x80 错误

Posted

技术标签:

【中文标题】Spring,Hibernate:尝试保存图像时出现无效的 UTF-8 起始字节 0x80 错误【英文标题】:Spring, Hibernate: Invalid UTF-8 start byte 0x80 error when trying to save images 【发布时间】:2019-08-21 11:52:19 【问题描述】:

我正在尝试发送一个包含图像数组的 json:


 Title: "Hello",
 images: [
    
     fileName: "hello",
     data: "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAA..."
   
  ]

并在 Spring+Hibernate 中将其保存到该实体中:

@Entity
@Table(name = "flat")
public class Flat 

    private Title;

    @OneToMany(fetch = FetchType.LAZY,
        cascade = CascadeType.ALL,
        mappedBy = "flat")
    private List<File> images = new ArrayList<>(); //see the File entity below

...

这里是文件实体:

@Entity
@Table(name = "file")
public class File 
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "flat_id")
    private Flat flat;

    @Lob
    private byte[] data;
...

(两个实体都有一个 id 字段)

因此,当“图像”中的“数据”字段为空时,一切正常。否则,我在 spring 中会出错:

JsonMappingException: Invalid UTF-8 start byte 0x80

我在这里看到了一个类似的问题(Jackson JSON parser invalid utf-8 start byte),那里的答案是关于错误的编码,但我仍然不明白我该如何解决这个问题。

【问题讨论】:

你是如何生成你的 Json 的?你在用什么图书馆?您使用什么注释来配置 json 生成?为什么你认为byte[] 会序列化为"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAA... 形式的url? @ErwinBolwidt 我正在使用 FileReader 读取图像,然后像这样获取 src: src = reader.result ,然后将其放入“数据”字段。它甚至不适用于 String 而不是 byte[] :( 【参考方案1】:
data:

实际上是一种 URL 格式(参见IETF)。所以你真的无论如何都不能使用它。 即使你只有

/9j/4AAQSkZJRgABAQAA...

这是一个编码的 Base64 String,而不是一个字节数组。 您需要处理data字段,并将String再次转换为byte[]

我建议您避免将请求/响应主体直接映射到 JPA 实体,而是创建一个 DTO 类,您将使用该类映射到实体(反之亦然),应用所需的转换。

【讨论】:

以上是关于Spring,Hibernate:尝试保存图像时出现无效的 UTF-8 起始字节 0x80 错误的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 和 Spring:尝试创建事务时出现异常

为啥在尝试将 Hibernate Spatial 用于 Spring Boot 项目时出现此错误?实例化异常

Spring Boot Hibernate多对一不保存joinColumn结果

尝试保存在本地编辑的图像时出现异常

尝试保存图像时出现 Android 运行时错误

使用 savefiledialog 保存图像时出现问题