response学习----实现文件下载

1)什么情况下会文件下载?
浏览器不能解析的就文件下载
2)什么情况下需要在服务器上编写文件下载代码?
理论上,浏览器可以解析的代码需要编写文件下载代码。
实际开发中,只要是需要下载的文件都需要编写文件下载代码。

文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端。所以文件下载需要IO技术将服务器端的文件使用InputStream读取到,在使用 ServletOutputStream写到response缓冲区中

图片从服务器端传输到浏览器,但浏览器直接解析图片显示在页面上, 而不是提供下载,我们需要设置两个响应头,告知浏览器文件的类型和文件的打开方 式。
1)告知浏览器文件的类型:response.setContentType(文件的MIME类型);
2)告示浏览器文件的打开方式是下载:
response.setHeader("Content-Disposition","attachment;filename=文件名称");

步骤:

1)获得需要下载的文件名称
String filename = request.getParameter("filename");
2)要下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型response.setContentType(this.getServletContext().getMimeType(filename));
3)告诉客户端不是此文件不是直接解析,而是以附件形式打开(下载)
response.setHeader("Content-Disposition", "attachment;filename="+filename);
4)获得文件的绝对路径
String path = this.getServletContext().getRealPath("download/"+filename);
5)获得文件的输入流
InputStream in = new FileInputStream(path);
6)获得输出流---通过response获得输出流,用于向客户端写内容
ServletOutputStream out = response.getOutputStream();
7)文件拷贝的模板代码
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
8)最后需要关闭输入与输出流,输入流为自己new的对象一定得手动关闭,输出流可以通过系统判断自动关闭
in.close();
//out.close();

servlet代码:

public class DownloadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //获得需要下载的文件名称
        String filename = request.getParameter("filename");
        //要下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型
        response.setContentType(this.getServletContext().getMimeType(filename));
        //告诉客户端不是此文件不是直接解析,而是以附件形式打开(下载)
        response.setHeader("Content-Disposition", "attachment;filename="+filename);
        //获得文件的绝对路径
        String path = this.getServletContext().getRealPath("download/"+filename);
        //获得文件的输入流
        InputStream in = new FileInputStream(path);
        //获得输出流---通过response获得输出流,用于向客户端写内容
        ServletOutputStream out = response.getOutputStream();
        //文件拷贝的模板代码
        int len = 0;
        byte[] buffer = new byte[1024];
        while((len=in.read(buffer))>0){
            out.write(buffer, 0, len);
        }
        
        in.close();
        //out.close();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

html代码:





Insert title here


    使用a标签指向服务器的资源
a.flv
a.jpg
a.mp3
a.mp4
a.txt
a.zip
使用服务端编码的方式实现文件下载
a.flv
a.jpg
a.mp3
a.mp4
a.txt
a.zip

但是,如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况,原因是不同的浏览器默认对下载文件的编码方式不同,ie是UTF-8编码方式,而火狐 浏览器是Base64编码方式。所里这里需要解决浏览器兼容性问题,解决浏览器兼容 性问题的首要任务是要辨别访问者是ie还是火狐(其他),通过Http请求体中的一个属性可以辨别


image.png

image.png

解决乱码的方法如下图:

response学习----实现文件下载_第1张图片
image.png

你可能感兴趣的:(response学习----实现文件下载)