HttpServletResponse对象实现文件下载

来源:互联网 发布:php 判断是否空数组 编辑:程序博客网 时间:2024/05/20 18:46

文件下载在我们的项目中是很常见的需求,实现文件下载功能的方式有很多,spring-mvc框架也提供了文件下载的功能。我们本次探讨的功能是利用HttpServletResponse对象来实现文件下载的功能。

思路如下:
(1)获取文件位置路径
(2)获取文件名
(3)设置content-disposition响应头,控制浏览器以下载的方式打开文件
(4)获取要下载的文件的输入流FileInputStream对象
(5)创建数据缓buffer冲区
(6)通过response对象获取OutputStream输出流对象
(7)将FileInputStream流对象写入到buffer缓冲区
(8)使用OutputStream输出流对象将buffer缓冲区数据输出到客户端浏览器

public class LoadServlet extends HttpServlet{    /**    * 载文件,通过OutputStream输出流     */    public void doPost(HttpServletRequest request,HttpServletResponse response){        //1.获取要下载的文件的绝对路径        String realPath = this.getServletContext().getRealPath("/load/ceshi.txt");        //2.获取要下载的文件名        String fileName = realPath.subString(realPath.lastIndexOf("\\")+1);        String userAgent = request.getHeader("User-Agent");        //针对IE或者以IE为内核的浏览器:        if (userAgent.contains("MSIE")||userAgent.contains("Trident")) {            fileName = java.net.URLEncoder.encode(fileName, "UTF-8");        } else {        //非IE浏览器的处理:            fileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1");        }        //3.设置content-disposition响应头控制浏览器以下载的方式打开文件        response.setHeader("content-disposition","attachment;filename="+fileName);        //4.获取要下载的文件输入流        InputStream in = new FileInputStream(realPath);        int len = 0;        //5.创建书缓冲区        byte[] buffer = new byte[1024];        //6.通过response对象获取OutputStream输出流对象        OutputStream os = response.getOutputStream();        //7.将FileInputStream流对象写入到buffer缓冲区        while((len=in.read(buffer))>0){            os.write(buffer,0,len);        }        //8.关闭流        in.close();        os.close();    }}

注意:
1、在文件名中含有中文编码时,设置响应头时需要使用URLEncoder.encode(fileName, “UTF-8”)方法进行编码,否则容易出现中文乱码的情况。
2、文件输出流对象应尽量使用OutputStream流对象,避免使用PrintWriter流对象。因为OutputStream是字节流对象,可以处理任意类型的数据;而PrintWriter是字符流输出对象,只能处理字符数据,如果用字符流处理字节数据,就会导致数据丢失。

0 0