将byte []转换为数据URI的Base64字符串

时间:2011-01-29 17:56:11

标签: java html bytearray base64

我知道这可能已被问过10000次,但是,我似乎无法找到问题的直接答案。

我的数据库中存储了一个代表图像的LOB;我从数据库中获取该图像,我想通过HTML IMG标记在网页上显示它。这不是我的首选解决方案,但它是一个临时实施,直到我找到更好的解决方案。

我正在尝试使用Apache Commons Codec以下列方式将byte []转换为Base64:

String base64String = Base64.encodeBase64String({my byte[]});

然后,我试图在我的页面上显示我的图像:

<img src="data:image/jpg;base64,{base64String from above}"/>

它显示浏览器的默认“我找不到此图像”,图像。

有没有人有任何想法?

感谢。

5 个答案:

答案 0 :(得分:39)

我使用了它并且工作正常(与接受的答案相反,后者使用的格式不建议用于此方案):

StringBuilder sb = new StringBuilder();
sb.append("data:image/png;base64,");
sb.append(StringUtils.newStringUtf8(Base64.encodeBase64(imageByteArray, false)));
contourChart = sb.toString();

答案 1 :(得分:12)

根据官方文档Base64.encodeBase64URLSafeString(byte[] binaryData)应该是您正在寻找的内容。

JPG的mime类型也是image/jpeg

答案 2 :(得分:3)

这是正确的语法。可能是您的Web浏览器不支持数据URI方案。见Which browsers support data URIs and since which version?

此外,JPEG MIME类型为image/jpeg

答案 3 :(得分:2)

您可能还想考虑将图像流式传输到浏览器,而不是将其编码在页面本身上。

这是一个通过servlet将文件中包含的图像流式传输到浏览器的示例,可以很容易地将其用于流式传输BLOB的内容,而不是文件:

  public void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException
  {
    ServletOutputStream sos = resp.getOutputStream();
    try {
      final String someImageName = req.getParameter(someKey);

      // encode the image path and write the resulting path to the response
      File imgFile = new File(someImageName);

      writeResponse(resp, sos, imgFile);
    }
    catch (URISyntaxException e) {
      throw new ServletException(e);
    }
    finally {
      sos.close();
    }
  }

  private void writeResponse(HttpServletResponse resp, OutputStream out, File file)
    throws URISyntaxException, FileNotFoundException, IOException
  {
    // Get the MIME type of the file
    String mimeType = getServletContext().getMimeType(file.getAbsolutePath());
    if (mimeType == null) {
      log.warn("Could not get MIME type of file: " + file.getAbsolutePath());
      resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
      return;
    }

    resp.setContentType(mimeType);
    resp.setContentLength((int)file.length());

    writeToFile(out, file);
  }

  private void writeToFile(OutputStream out, File file)
    throws FileNotFoundException, IOException
  {
    final int BUF_SIZE = 8192;

    // write the contents of the file to the output stream
    FileInputStream in = new FileInputStream(file);
    try {
      byte[] buf = new byte[BUF_SIZE];
      for (int count = 0; (count = in.read(buf)) >= 0;) {
        out.write(buf, 0, count);
      }
    }
    finally {
      in.close();
    }
  }

答案 4 :(得分:1)

如果您不想从servlet流,则将文件保存到webroot中的目录,然后创建指向该位置的src。这样Web服务器就可以完成提供文件的工作。如果您感觉特别聪明,可以通过timestamp / inode / crc32检查现有文件,只有在DB中发生更改才能将其写出来,这样可以提高性能。此文件方法还将自动支持ETag和if-modified-since标头,以便浏览器可以正确缓存文件。