Servlet的学习之Response响应对象(2)

时间:2023-03-08 22:21:04
Servlet的学习之Response响应对象(2)

  本篇接上一篇《Servlet的学习之Response响应对象(1)》,继续从HttpServletResponse响应对象来介绍其方法和功能。

  使用setHeader方法结合HTTP协议的content-disposition响应头可以将某些web资源以下载方式回传给客户端。但是在下载中文文件的时候会有一些问题,这问题会怎么发生呢?

  我们现在来进行从客户端向服务器端下载一个图片文件,先在MyEclipse的自创建【myservlet】web工程下准备一个图片文件,放置在web目录下的【download】文件夹中:

  Servlet的学习之Response响应对象(2)

创建名为ServletResponse的Servlet,代码如下:

 public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //1,获取将要下载的文件路径和文件名
ServletContext context = this.getServletContext();
String filePath = context.getRealPath("/download/银魂全家福.jpg");
String fileName = filePath.substring(filePath.lastIndexOf("\\")+1); //2,使用HTTP协议的Content-Disposition请求头告诉客户端以下载方式接受这个数据(文件)
response.setHeader("content-disposition", "attachment;filename="+fileName); //3,通过流向响应对象写数据实体,然后由响应对象提交给客户端
FileInputStream fis = null;
try{
OutputStream out = response.getOutputStream();
fis = new FileInputStream(filePath);
byte[] buff = new byte[1024];
int len = 0;
while((len =fis.read(buff))>0) {
out.write(buff, 0, len);
}
}
finally {
if(fis!=null) {
fis.close();
}
}
}

而这样,当在浏览器中访问该Servlet时就会出现下载请求的弹窗:

  Servlet的学习之Response响应对象(2)

这里就有一个问题了,下载文件的名称不对,如果是英文文件名就不会出现这个问题,而中文文件名就必须通过URL编码:

将上述代码中的response.setHeader("content-disposition", "attachment;filename="+fileName);

改为:response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8")); 即可。

  我们重新发布该工程,然后再在浏览器中访问该Servlet,看到这回的下载弹窗:

  Servlet的学习之Response响应对象(2)

这回就可以下载了,当我们下载后就可以看到确实是服务器上得资源:

  Servlet的学习之Response响应对象(2)(真棒!)

所以中文文件下载方式要先通过URLEncoder进行编码后再写入相应对象中。

  下面一个案例来讲述用HttpServletResponse响应对象来向客户端输出随机图片(可以用作验证码)。

  通常使用BufferedImage类来创建缓存图片对象,然后通过该对象创建图片对象Graphics2D对象,用图片对象进行文字和边框的设定等等之后,由ImageIO对象来负责将图片对象通过IO流传递给HttpServletResponse对象。

(未完待续。。。)