美文网首页JAVA-WEB基础
文件下载(妈妈再也不用担心我了)

文件下载(妈妈再也不用担心我了)

作者: superNeil | 来源:发表于2020-05-19 10:48 被阅读0次

    1.文件下载(妈妈再也不用担心了)

    其实 , 我们做的这些 , 文件下载的 思路 不就是 : 找到文件的路径 , 然后通过输出流 出来吗?
    1.1文件下载简单实现

    将服务器中的资源下载保存到电脑中


    image-20200519093343146.png image-20200519093439837.png

    浏览器显示 , 点击 机可以下载了 . 但是有个问题 , 这个文件是放在 WEB-INF 外面的 , 文件不安全 , 谁想拿都能拿, 实际开发中 , 我们的文件是应该有一定的权限才能下载的 . 所以 , 文件应该放在 WEB-INF中 .


    image-20200519093829727.png

    既然 放在了 WEB-INF中了 , 那我们就不能直接访问了 , 此时就需要在servlet中 获取文件 --响应给浏览器.

    那我们的 download.jsp 页面 就应该这样写了 .

    <head>
        <title>登录页面</title>
    </head>
    <body>
    <h3>文件下载</h3>
    <a href="/download?fileName=老虎.rar">下载老虎</a>
    <a href="/download?fileName=猫.rar">下载猫</a>
    </body>
    

    servlet 可以这样写

    @WebServlet("/download")
    public class DownServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取文件名
            String fileName = req.getParameter("fileName");
            //找到 文件的路径
            String realPath = getServletContext().getRealPath("/WEB-INF/download/");
            //文件复制语法糖Files.copy(地址,输出流)
            Files.copy(Paths.get(realPath,fileName),resp.getOutputStream());
        }
    }
    

    这样 ,我们的简单文件下载就完成了 .

    你会发现会有文件名称会有问题 .

    默认情况下 , Tomcat服务器未告知浏览器文件的名称 , 所以需要手动通知浏览器文件名称.

    //客户端的弹出对话框,对应的文件名 (中文字符需要转一下编码)

     resp.setHeader("Content-Disposition: attachment; filename=文件名称");
    

    处理中文文件名称问题 :

    处理后的 servlet 应该是这样的 , 但是 这里无需记 , 需要 时去 copy下就可 .

    @WebServlet("/download")
    public class DownServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取文件名
            String fileName = req.getParameter("fileName");
            //找到 文件的路径
            String realPath = getServletContext().getRealPath("/WEB-INF/download/");
            //文件复制语法糖Files.copy(地址,输出流)
            Path s = Paths.get(realPath, fileName);
            System.out.println("*****" + s);//得到的是一个地址
    
            //----------------处理文件中文问题
            resp.setHeader("Content-Disposition","attachment;filename="+fileName);
            String header = req.getHeader("User-Agent");
            System.out.println(header);
            if (header.contains("MSIE")) {
                resp.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
            } else {
                resp.setHeader("Content-Disposition","attachment; filename=" + new String(fileName.getBytes(), "ISO-8859-1"));
            }
            Files.copy(Paths.get(realPath, fileName), resp.getOutputStream());
    
    
        }
    }
    

    相关文章

      网友评论

        本文标题:文件下载(妈妈再也不用担心我了)

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