我正在尝试保存并显示来自mongodb数据库的图像。我将它保存在以base-64字符串格式化的数据库中。 例如,这是其中一张图片:
"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgEAYABgAAD/7gAOQWRvYmUAZAAAAAAB/+EN/kV4aWYAAE1NACoAAAAIAAgBMgACAAAAFAAAAG4BOwACAAAACwAAAIJHRgADAAAAAQAFAABHSQADA......
这是findImage服务,它将图像的字符串格式更改为字节数组:
public byte[] findImage(String id)
{
String str = chRepository.findImage(id);
byte[] b = str.getBytes();
return b;
}
这是控制器类中的findImage:
@GetMapping("/findImage/{id}")
public byte[] findImage(@PathVariable String id) throws IOException
{
byte[] bb = IOUtils.toByteArray(new ByteArrayInputStream(chService.findImage(id)));
return bb;
}
我创建了一个网址,在我的脚本文件中显示图片:
<script>
function makeURL(val, row) {
if (val){
return '<a target="_blank" href= "' +window.location.href+ 'ch/findImage/' + val + '">image</a>';
}
}
</script>
但是在调用这样的网址时:
http://localhost:8080/ch/findImage/5
它给出错误:图像无法显示,因为它包含错误。
注意:我猜服务findImage函数存在问题,它将base-64 String更改为byte []数组,但我不知道如何将其更改为正确的格式。
答案 0 :(得分:0)
您只在字符串上调用getBytes()
,但您必须考虑两点。
该字符串具有在HTML页面内嵌图像数据的特殊语法。第一部分包含MIME类型,;base64
表示逗号后面的部分是Base64编码。
getBytes()
为您提供字符串的字节表示形式。这不是你想要的。因为Base64是一种特殊的编码,所以你必须特别对待它。您可以使用标准类java.util.Base64
。
示例:
/**
* Decodes the Base64 part to bytes.
*
* @param img An inline data encoded in Base64 like <code>"data:image/jpeg;base64,/9j/4AAQSkZJRg..."</code>.
*
* @return Decoded data part
*/
public static byte[] parseImageString(String img) {
// Avoid a NPE
if(img == null) {
return null;
}
// Use only the part after the comma
final int pos = img.indexOf(',');
if(pos >= 0) {
final String base64Part = img.substring(pos + 1);
final Base64.Decoder base64Decoder = Base64.getDecoder();
return base64Decoder.decode(base64Part);
} else {
return null;
}
}
答案 1 :(得分:0)
尝试在控制器中使用这些:
public void findImage(@PathVariable String id,
HttpServletResponse response) throws IOException
{
BufferedImage myIMG = ImageIO.read(<inputStreamHere>)
//you'll have to create inputstream for ur image
ServletOutputStream out = response.getOutputStream();
response.setContentType("image/jpeg");
ImageIO.write(bufferedImage, "jpeg", out);
out.close();
}
或者您可以这样做:
@GetMapping("/findImage/{id}")
public byte[] findImage(@PathVariable String id,
HttpServletResponse response) throws IOException
{
ServletOutputStream out = response.getOutputStream();
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
byte[] b;
ImageIO.write(<bufferedImageHere>, "png", Base64.getEncoder().wrap(os));
StringBuilder sb = new StringBuilder();
sb.append("data:image/png;base64,").append(os);
b = String.valueOf(sb).getBytes();
out.write(b);
} catch (IOException ioe) {
throw new Exception(ioe);
}
}