2017-05-10 78 views
0

我试图保存并显示来自mongodb数据库的图像。我将它保存在以base-64字符串格式化的数据库中。 例如这是那些图像中的一个:无法显示图像,因为它包含错误jsp

"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> 

但调用这样一个URL时:

http://localhost:8080/ch/findImage/5 

它给人的错误:无法显示图像,因为它包含错误。

注意:我猜服务findImage函数存在一个问题,它将base-64字符串更改为byte []数组,但我不知道如何将其更改为正确的格式。

+0

向我们展示了整个JSP标签 –

+0

说你的形象将成为'png'形象,那么要么做etContentType(“img/png”);'或做一些像'response.setHeader(“content-type”,“img/png”);'。 –

+0

这只是一个按钮,其onclick功能设置在makeURL @BasilBattikhi – user5621266

回答

0

你只打电话给getBytes(),但有两点你必须考虑。

  1. 字符串有inlineing一个HTML页面内的图像数据的特殊语法。第一部分包含MIME类型和;base64,表示逗号后面的部分是Base64编码。

  2. 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; 
    } 
} 
+0

是不是低安全性的东西,如果我们发送字节数组而不是base64字符串? – user5621266

+1

Base64不会提高安全级别。这不是加密。它只是同一个字节块的替代表示。如果您希望只有专用用户才能查看此映像,则应使用HTTPS和具有会话的登录机制。然后在处理图像请求的servlet中,您可以为不允许用户查看此图像的用户发送错误。 – vanje

+0

如果它不提高安全性,我们为什么要使用它? – user5621266

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); 
    } 
} 
相关问题