如何从带有编码base64图像的Json文件中获取byte[]



我有一个包含JSON结构化数据的文件,其中一个属性是Base64编码的图像。我使用POJO映射到Java对象,并将上面的image属性指定为String类型。(尝试了byte[],但无法创建Java对象,所以我使用了String。(

现在,我必须使用属性类型为byte[]的JPA实体将其保存到数据库中。

实体:

@Lob
private byte[] profilePic;

DTO:

private String profilePic;

问题

dto.getProfilePic().getBytes()

getBytes("utf-8")

正在更改图像,并且图像已损坏。图像正在从类似iVBORw0KGgoAAAANSUhEUgAAB.....的东西变化

89504E470D0A1A0A0000000D4948445200....

注意:内容在JSON格式的文件中

是否可以使用任何其他JSON库从文件序列化到byte[]?使用的库是Gson。

Gson gson = new Gson(); 
StagingDTO[] infoArray = gson.fromJson(reader, StagingDTO[].class);

或者有什么方法可以从文件中获取byte[]

您可以使用java.util.Base64.decode((。此方法获取一个Base64字符串并返回byte[]。您最终应该保存字节[]。

tl;dr:使用Base64.Decoder类。

一个简单的工作示例:

final String REDDOT_png  = "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTM0A1t6AAAAI0lEQVQYV23HsQkAAAjAsP7/tC7SoQhZwvDr1atXr169+gMLKP8/wbwli7QAAAAASUVORK5CYII=";
byte[] binaryContent = Base64.getDecoder().decode(REDDOT_png);
Files.write(Paths.get("test.png"), binaryContent);
System.err.println("Wrote file to: "+Paths.get("test.png").toAbsolutePath());

在您的情况下,只需将decode()调用中的REDDOT_png交换为DTO的getProfilePic()方法,并删除其他三行即可。


您为什么面临这个问题

您的问题是在String类的Object上调用getBytes()方法。getBytes()方法实际上执行以下操作(来源(:

使用平台的默认字符集,将结果存储到一个新的字节数组中。

例如:

byte[] test = "a".getBytes();
System.err.println(test[0]);

写入:97,即Ascii / UTF-8 / UTF-16。。。表示";a";。

但是您不想将base64 String的二进制表示持久化到数据库中,您实际上想要解码的base64 String,它只是文件的二进制内容。

我从gson切换到jackson api,它可以工作

try (FileReader reader = new FileReader(tempFile)){

//Gson gson = new Gson(); 
//List<MyDTO> qDTOs = gson.fromJson(reader, new TypeReference<List<MyDTO>>(){});
List<MyDTO> qDTOs = objectMapper.readValue(reader, new TypeReference<List<MyDTO>>(){});
My DTO has
private byte[] profilepic;

最新更新