我有一个包含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;