Servlet返回GIF图像没有动画

时间:2014-08-05 00:30:53

标签: servlets gif

首先在我的servlet中我使用了一些博客中的Image-Servlet jar,我的图像运行正常。但问题是任何人都可以使用inspect元素并附加带../的url来访问其他目录,这也是一个很大的安全问题。所以我问了一个关于SO的问题,人们建议自己编写代码,因为它很简单,我可以完全控制。

所以这是我的代码,

    String path1=getServletConfig().getServletContext().getRealPath("");      
    System.out.println(path1);  // /usr/share/tomcat7/webapps/myProject    
    String l = File.separator;

    f = new File(path1+l+"images"+l+"load.gif"); 
    BufferedImage bi = ImageIO.read(f);
    OutputStream out = response.getOutputStream();
    ImageIO.write(bi, "gif", out);
    out.close();

它运作良好,但问题是图像不再动画。我尝试下载并打开它,但它没有动画。

所以我猜在将文件读入bufferedImage时会发生一些变化。

图像看起来像这些 animating gif non animating gif
您可以在inspect元素或source中看到两者都是gif但只有一个是动画

1 个答案:

答案 0 :(得分:1)

您只是发送图像的第一帧。

ImageIO.read只读取第一帧(而BufferedImage只能包含单个帧/图像)

您可以通过用于发送任何二进制内容的相同技术来实现它。

 String path1=getServletConfig().getServletContext().getRealPath("");      
 System.out.println(path1);  // /usr/share/tomcat7/webapps/myProject    
 String l = File.separator;

 f = new File(path1+l+"images"+l+"load.gif"); 
 OutputStream out = response.getOutputStream();
 InputStream in = new FileInputStream(f);

 try {
         byte[] buffer = new byte[1024]; 
         int count;

         while ((count = in.read(buffer)) != -1) {
           out.write(buffer, 0, count);
         }

// Flush out stream, to write any remaining buffered data
out.flush();
 }
finally {
in.close(); 
}


 out.close();

this