文件下载功能需求
- 页面显示超链接
- 点击超链接后弹出下载提示框
- 完成文件下载
分析
- 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则出现下载提示框。
- 使用响应头设置资源打开方式。
- content-disposition:attachment;filename=xxx
实现功能
-
新建servlet获取get方法中的filename参数
-
//获取url中的参数 String filename = req.getParameter("filename");
-
-
判断获取到的参数是否为空
-
if (filename != null && !filename.equals("")) {}else{}
-
-
如果为空,则输出提示
-
resp.setContentType("text/html;charset=utf-8"); PrintWriter writer = resp.getWriter(); writer.write("文件路径为空,请重新输入。");
-
-
如果不为空,读取文件输出
-
//获取文件输入流 FileInputStream fis = new FileInputStream(filepath); //设置头信息 String mime = context.getMimeType(filename); resp.setContentType(mime); resp.setHeader("content-disposition", "attachment;filename="+filename); //获取Servlet输出流 ServletOutputStream sos = resp.getOutputStream(); //读取文件输入流中的数据,写入到Servlet输出流中 byte[] ch = new byte[1024 * 10]; int len = 0; while ((len = fis.read(ch)) != -1) { esos.write(ch, 0, len); } fis.close();
-
-
若文件读取发生io错误
-
//文件未读取成功 try { resp.setContentType("text/html;charset=utf-8"); PrintWriter writer = resp.getWriter(); writer.write("文件名错误,请重新输入。"); } catch (IOException e1) { e1.printStackTrace(); }
-
-
创建html文件
-
创建输入框和按钮
-
<input id="input" type="text"> <input id="button" type="button" value="下载文件">
-
-
使用js实现点击按钮下载功能
-
var inputbox = document.getElementById("input"); var button = document.getElementById("button"); button.onclick = function () { var inputValue = inputbox.value; window.location.href = "filedownload?filename="+inputValue; }
-
完整代码
FileDownLoadServlet.java
@WebServlet("/filedownload")
public class FileDownLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException {
//获取url中的参数
String filename = req.getParameter("filename");
if (filename != null && !filename.equals("")) {
ServletContext context = this.getServletContext();
//查找文件
String filepath = context.getRealPath("/file/" + filename);
try {
//获取文件输入流
FileInputStream fis = new FileInputStream(filepath);
//设置头信息
String mime = context.getMimeType(filename);
resp.setContentType(mime);
resp.setHeader("content-disposition", "attachment;filename="+filename);
//获取Servlet输出流
ServletOutputStream sos = resp.getOutputStream();
//读取文件输入流中的数据,写入到Servlet输出流中
byte[] ch = new byte[1024 * 10];
int len = 0;
while ((len = fis.read(ch)) != -1) {
sos.write(ch, 0, len);
}
fis.close();
} catch (IOException e) {
e.printStackTrace();
//文件未读取成功
try {
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write("文件名错误,请重新输入。");
} catch (IOException e1) {
e1.printStackTrace();
}
}
} else {
try {
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write("文件路径为空,请重新输入。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
download.html
<html>
<head>
<title>文件下载</title>
</head>
<body>
<input id="input" type="text">
<input id="button" type="button" value="下载文件">
<script>
var inputbox = document.getElementById("input");
var button = document.getElementById("button");
button.onclick = function () {
var inputValue = inputbox.value;
window.location.href = "filedownload?filename="+inputValue;
}
</script>
</body>
</html>
附
-
当下载文件为中文时浏览器下载无法正常展示中文名的问题
-
public static String getFileName(String agent, String filename) throws UnsupportedEncodingException { if (agent.contains("MSIE")){ filename = URLEncoder.encode(filename, "utf-8"); filename = filename.replace("+", ""); }else if (agent.contains("Firefox")){ Base64.Encoder encoder = Base64.getEncoder(); filename = "=?utf-8?B?"+encoder.encodeToString(filename.getBytes("utf-8")) + "?="; }else{ filename = URLEncoder.encode(filename, "utf-8"); } return filename; }
源码地址
https://github.com/xiaochen0517/StudySpace/tree/master/idea/TestDemo4