Response综合案例-文件下载

2020-10-20 10:22发布

Response综合案例-文件下载

  • (1)文件的复制
    本质就是将一个文件的所有字节读出来,再复制到另一个文件中

  • (2)打开网络文件
    浏览器读服务器的文件,本质也是复制

  • (3)下载网络文件
    本质文件复制,不过通过设置响应头,控制浏览器以附件的形式下载

response-综合案例-弹出保存框

如果需要浏览器弹出保存框,则需要通过设置响应头的两个指令

  • Content-Type 设置MIME-Type

  • Content-Disposition 设置附件名称

    //指令,调用浏览器弹出下载框,由用户自己保存
        response.setHeader("Content-Type", mimeType);
        response.setHeader("Content-Disposition", "attachment;filename="+saveName);1234

response-综合案例-getMimeType方法

  • (1)如何设置附件
    HTTP协议规定,如果一个服务器的文件要以附件的形式下载,必须设置两个响应头
    1:下载文件的类型(MIME类型) 由下载文件的后缀名决定
    tomcat服务器中的web.xml中包含大量的扩展名对应的mime-type的对应关系
    比如 a.jpg 对应的mime类型是 image/jpg

getMimeType(filename) //servletContext对象的方法1

2:设置一个头部信息,这个信息用来指定附件下载时,文件的名字

response-综合案例-文件名为中文

1: 如果是非中文的保存名称,浏览器可以正常保存,但如果是中文的话,需要进行先进行URL编码
美女 -----> %ED%AD%AC
2:不同的浏览器转码方式不一样: IE浏览器 火狐浏览器 其他浏览器

 public  String getFileName(HttpServletRequest request,String filename) throws UnsupportedEncodingException {
        String agent = request.getHeader("User-Agent");
        if (agent.contains("MSIE")) {
            // IE浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", " ");
        } else if (agent.contains("Firefox")) {
            // 火狐浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }1234567891011121314151617

完整下载代码

@WebServlet("/down")public class Demo05Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取请求参数中的文件名
        String filename=request.getParameter("filename");

        String saveName=getFileName(request,filename);
        //自动根据文件的后缀名得到mime-type类型
        String mimeType = getServletContext().getMimeType(filename);
        System.out.println(mimeType);
        //指令,调用浏览器弹出下载框,由用户自己保存
        response.setHeader("Content-Type", mimeType);
        response.setHeader("Content-Disposition", "attachment;filename="+saveName);


         //1.加载a.jpg文件成为一个输入流
        InputStream inputStream =  getServletContext().getResourceAsStream("download/"+filename);
        //2.再使用字节流 将数据写到浏览器
        OutputStream outputStream = response.getOutputStream();
        //3.浏览器自动将数据显示成图片
        FileService fileService = new FileService();
        fileService.copy(inputStream,outputStream);
        //4.关闭
        outputStream.close();
        inputStream.close();
    }
    public  String getFileName(HttpServletRequest request,String filename) throws UnsupportedEncodingException {
        String agent = request.getHeader("User-Agent");
        if (agent.contains("MSIE")) {
            // IE浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", " ");
        } else if (agent.contains("Firefox")) {
            // 火狐浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }}



作者:水巷石子

链接:https://blog.csdn.net/qq_37924905/article/details/108499993

来源:CSDN
著作权归作者所有,转载请联系作者获得授权,切勿私自转载。