2014-10-28 65 views
1

我想上传一个HTML画布到Java Servlet并返回画布数据作为PNG图像。我的问题是来自servlet的响应不正确,因此没有呈现为图像。保存在磁盘上的文件虽然工作正常。从java servlet的服务PNG不显示

我在做什么错?我是否需要设置更多标题?内容长度?

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{ 
    BufferedImage bfi = null; 
    OutputStream out = null; 
    PrintWriter htmlOut = null; 
    try{ 
     response.setContentType("image/png"); 

     String img64 = (String) request.getParameter("base64image");    
     byte[] decodedBytes = DatatypeConverter.parseBase64Binary(img64);      
     bfi = ImageIO.read(new ByteArrayInputStream(decodedBytes));  
     out = response.getOutputStream(); 
     ImageIO.write(bfi, "png", out); 

     //Save on disk 
     File outputfile = new File("webapps/saved.png"); 
     ImageIO.write(bfi , "png", outputfile);   


    }catch(Exception e){ 
     //ERROR HANDLING 
    } 
    finally{ 
     if(bfi != null){ 
      bfi.flush(); 
     } 
     if(out != null){ 
      out.flush(); 
      out.close();; 
     } 
     if(htmlOut != null){ 
      htmlOut.close(); 
     }   
    } 

} 
+0

确保设置适当的标题响应为好。 – 2014-10-28 16:20:15

+0

什么是正确的标题? Content-Length是否需要? – gusper 2014-10-28 18:16:35

回答

0

也许我是盲目的,但我只是看不到你在响应对象上设置Content-Length标头。

+0

我试着将Content-Length设置为“decodedBytes.length”,但我仍然无法使它工作。 – gusper 2014-10-28 18:15:54

0

我有同样的问题,但只能在IE中出现错误消息:

An existing connection was forcibly closed by the remote host 

以下后帮我: https://stackoverflow.com/a/8623747/1064057

我必须设置MIME类型和内容长度。

String contentType = MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(file); 
if (contentType == null) { 
    log.warn("Cannot get mime type of file" + file.getAbsolutePath()); 
} else { 
    response.setContentType(contentType); 
} 
response.setContentLength((int)file.length()); 

也许这对另一个案件或其他人有帮助。
亲切的问候
斯坦