美文网首页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