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());
}
}
网友评论