从java servlet提供png并没有显示出来

时间:2014-10-28 16:16:08

标签: java servlets canvas

我想将html画布上传到java servlet并将画布数据作为png图像返回。我的问题是来自servlet的响应不正确,因此没有呈现为图像。将文件保存在磁盘上可以正常工作。

我做错了什么?我需要设置更多标题吗?内容长度?

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();
         }           
     }

}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我遇到了同样的问题,但仅在IE中出现错误消息:

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());

以下帖子帮助了我: https://stackoverflow.com/a/8623747/1064057

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

# General Configuration
sonar.security.realm=LDAP
ldap.url=ldap://ldap:389

# User Mapping
ldap.user.baseDn=ou=users,ou=udd,dc=example,dc=com
ldap.user.request=(&(objectClass=inetOrgPerson)(uid={uid}))
ldap.user.realNameAttribute=cn
ldap.user.emailAttribute=mail

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