无法显示图像,因为它包含jsp中的错误

时间:2017-05-10 11:37:03

标签: javascript java jsp

我正在尝试保存并显示来自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 []数组,但我不知道如何将其更改为正确的格式。

2 个答案:

答案 0 :(得分:0)

您只在字符串上调用getBytes(),但您必须考虑两点。

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

  2. getBytes()为您提供字符串的字节表示形式。这不是你想要的。因为Base64是一种特殊的编码,所以你必须特别对待它。您可以使用标准类java.util.Base64

  3. 示例:

    /**
     * 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);
    }
}