首先在我的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时会发生一些变化。
图像看起来像这些
您可以在inspect元素或source中看到两者都是gif但只有一个是动画
答案 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