【问题标题】:How to get byte [] from Json file with encoded base64 image如何从带有编码base64图像的Json文件中获取字节[]
【发布时间】:2021-05-03 21:45:58
【问题描述】:

我有一个包含 JSON 结构化数据的文件,其中一个属性是 Base64 编码图像。我使用 POJO 映射到 Java 对象,并将上述图像属性指定为 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 gson


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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() 方法实际上做了以下事情(Source):

    使用平台的编码将此字符串编码为字节序列 默认字符集,将结果存储到一个新的字节数组中。

    举个例子:

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

    写入:97,这是 Ascii / UTF-8 / UTF-16 ... "a" 的表示形式。

    但是您不想将base64 String 的二进制表示形式保存到数据库中,您实际上需要解码后的base64 String,这只是您文件的二进制内容。

    【讨论】:

    • 我使用了 byte[] decodedString = Base64.getDecoder().decode(stagingDto.getProfilePic());它没有工作
    • “没有用”是什么意思?你遇到了什么错误?
    • 你忽略了我的要求。它是 json 数据、许多键和许多值,并且在一个文件中。所以首先它需要映射到 java 对象,才能进入像 REDDOT_png 这样的属性。当我收到要按原样保存的编码输入时,不确定为什么必须解码?
    • 好吧,如果你想存储一个base64编码的图像,正确的实体类型应该是String而不是byte[]byte[] 表示二进制数据。 base64 字符串的二进制数据只是一些 char 值。因此,要么将实体的类型更改为 String,要么在从实体创建 DTO 时添加对 new String(yourBase64ByteArray) 的调用。
    【解决方案3】:

    我从 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-01
      • 2013-03-23
      • 2017-11-02
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 2017-01-08
      • 2021-06-11
      相关资源
      最近更新 更多