将图像编码和解码到base64时,java内存不足异常

时间:2018-05-27 09:41:12

标签: java image out-of-memory

我正在尝试上传图片并在Base64 encoding & decoding

的帮助下检索

如下

解码

if (imgString != null ) {  
    BufferedImage image = null;
    byte[] imageByte;

    BASE64Decoder decoder = new BASE64Decoder();
    imageByte = decoder.decodeBuffer(imgString);
    ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
    image = ImageIO.read(bis);
    bis.close();

    String realPath  = request.getSession().getServletContext().getRealPath("/resources/images/"+studentDetails.getFirstname()+".png");

    File outputfile = new File(realPath);    
    ImageIO.write(image, "png", outputfile); 
        studentDetails.setStuImg(outputfile.toString());
    }

解码时我有时会遇到以下异常

  

2018年5月27日下午3:04:27 org.apache.catalina.core.StandardWrapperValve调用       严重:servlet [spring]的Servlet.service()在路径[/ campasAdmin]的上下文中引发异常[Handler dispatch failed;嵌套异常是java.lang.OutOfMemoryError:带有根本原因的Java堆空间       java.lang.OutOfMemoryError:Java堆空间

编码

if (imagePath != null && imagePath.length() > 0) {      
    byte[] bytes = Files.readAllBytes(Paths.get(imagePath));
    encodedFile = Base64.getEncoder().encodeToString(bytes);
}

它有什么解决方案?我该如何避免呢?

1 个答案:

答案 0 :(得分:0)

  

它有什么解决方案?我该如何避免呢?

两种可能的方法:

增加堆大小。

除非您的图像很大,否则您应该能够在内存中保留像素和base64格式的图像......几次。

流式传输图像。

用于读取和写入图像的代码将整个图像加载到内存中,然后将其写出。你不需要这样做。相反,你可以用clunks处理它:

  1. 从源头阅读一个chuck,
  2. 对Base64数据进行编码或解码,
  3. 将编码/解码的块写入目标
  4. 重复...直到流消耗完为止。
  5. 链接的Q& A提供了一些如何执行此操作的说明。