我知道这可能已被问过10000次,但是,我似乎无法找到问题的直接答案。
我的数据库中存储了一个代表图像的LOB;我从数据库中获取该图像,我想通过HTML IMG标记在网页上显示它。这不是我的首选解决方案,但它是一个临时实施,直到我找到更好的解决方案。
我正在尝试使用Apache Commons Codec以下列方式将byte []转换为Base64:
String base64String = Base64.encodeBase64String({my byte[]});
然后,我试图在我的页面上显示我的图像:
<img src="data:image/jpg;base64,{base64String from above}"/>
它显示浏览器的默认“我找不到此图像”,图像。
有没有人有任何想法?
感谢。
答案 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标头,以便浏览器可以正确缓存文件。