用 Java 编码的 Base64 图像不显示在 HTML 中

5 html java base64 encoding image

我已经使用org.apache.axis.encoding.Base64类将图像编码为 base64 。我的代码:

public String get64EncodedPhotoForUser(User user) {

        // Path to image
        String path = "some path to the jpg file on the server";

        // Read image from server
        String base64Image = null;

        try {

            BufferedImage bufferedImage = ImageIO.read(new File(path));
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "jpg", baos);
            baos.flush();
            byte[] imageInByte = baos.toByteArray();
            baos.close();
            base64Image = Base64.encode(imageInByte);

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        return base64Image;

    }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我首先将图像转换为字节数组,因为这是 encode 方法所期望的。一切似乎都正常,我取回了我的编码字符串,它似乎是一个正确编码的字符串。值得一提的是,一些在线解码器可以正确解码图像,而另一些则不能,我认为这很奇怪。

当我尝试在 HTML 中显示图像时:

<img ng-src="data:image/png;base64,/9j/4AAQSkZJRgABAgAAA..." id="avatar">
Run Code Online (Sandbox Code Playgroud)

它不起作用。当您将 html 指向不存在的图像时,我只是得到了“缺少图像”图标。

我已将编码的字符串复制并粘贴到 jsfiddle 中,您可以在此处查看

PS - 我还使用 base64 字符串,并将它从服务器以 JSON 对象以及其他一些东西的形式传递给客户端。您在 jsfiddle 中看到的 Base64 字符串是我在客户端得到的。是否编码字符串在通过网络传递时可能已损坏或修改?

Tim*_*sen 3

Base 64 编码字符串末尾的等号已转换为其 unicode 格式 ( \u003d):

/9j/4AAQSkZJR...IQd6QknrS54460h60BY//9k\u003d
  ^                                     ^
 start                                 end
Run Code Online (Sandbox Code Playgroud)

\u003d当我将字符串末尾的更改为标签=中的时<img>,图像在我的 Chrome 浏览器中加载正常。这是我用来加载图像的代码:

<IMG src="data:image/jpeg;base64,/9j/4AAQSkZJR...IQd6QknrS54460h60BY//9k=">
Run Code Online (Sandbox Code Playgroud)

请注意,删除 unicode 字符似乎也可以在浏览器中使用。

怎么了:

我使用 Apache AxisBase64.encode()方法测试了您的 Java 代码,输出看起来正确,即字符串按预期以等号结尾。但是,在您提供的 JS Fiddle 中,会出现 unicode 字符。根据此 GitHub 博客,该库 HTML 似乎Gson由于某种原因转义了最后一个字符。无论它是错误还是坏功能,Gson都提供了一种解决此问题的方法:

Gson gson = new GsonBuilder().disableHtmlEscaping().create();
Run Code Online (Sandbox Code Playgroud)

使用此版本的Gson对象构建 JSON 对象,您不应该遇到转义问题。