美文网首页
response学习----实现文件下载

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

作者: VICTORY_小色 | 来源:发表于2019-01-17 12:07 被阅读0次

    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代码:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <a>使用a标签指向服务器的资源</a><br>
        <a href="/WEB14/download/a.flv">a.flv</a><br>
        <a href="/WEB14/download/a.jpg">a.jpg</a><br>
        <a href="/WEB14/download/a.mp3">a.mp3</a><br>
        <a href="/WEB14/download/a.mp4">a.mp4</a><br>
        <a href="/WEB14/download/a.txt">a.txt</a><br>
        <a href="/WEB14/download/a.zip">a.zip</a><br>
        <a>使用服务端编码的方式实现文件下载</a><br>
        <a href="/WEB14/downloadServlet?filename=a.flv">a.flv</a><br>
        <a href="/WEB14/downloadServlet?filename=a.jpg">a.jpg</a><br>
        <a href="/WEB14/downloadServlet?filename=a.mp3">a.mp3</a><br>
        <a href="/WEB14/downloadServlet?filename=a.mp4">a.mp4</a><br>
        <a href="/WEB14/downloadServlet?filename=a.txt">a.txt</a><br>
        <a href="/WEB14/downloadServlet?filename=a.zip">a.zip</a><br>
    </body>
    </html>
    

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


    image.png
    image.png

    解决乱码的方法如下图:

    image.png

    相关文章

      网友评论

          本文标题:response学习----实现文件下载

          本文链接:https://www.haomeiwen.com/subject/qrtidqtx.html