转载:https://www.cnblogs.com/longqingyang/p/5579889.html
原理:浏览器请求列表servlet,servlet遍历上传目录下的文件,将文件名存放到map里面,传给jsp文件,jsp负责设置下载地址并显示,点击下载按钮后,调用下载servlet,处理传递到后台的文件名并找到相应文件,使用getOutputStream()输出。
代码:
ListFileServlet.java
package servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class ListFileServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uploadFilePath = this.getServletContext().getRealPath("/WEB-INF/upload");
Map<String, String> fileMap = new HashMap<>();
fileList(new File(uploadFilePath), fileMap);
request.setAttribute("fileMap", fileMap);
request.getRequestDispatcher("/fileupload/listfile.jsp").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
public void fileList(File file, Map fileMap) {
if (!file.isFile()) {
File[] files = file.listFiles();
for (File file1 : files) {
System.out.println(file1.getName());
fileList(file1, fileMap);
}
} else {
String fileName = file.getName();
String realName = fileName.substring(fileName.indexOf("_") + 1);
fileMap.put(fileName, realName);
}
}
}
listfile.jsp,此处使用jstl需要下载jstl.jar库和standard.jar库,下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>文件下载列表</title>
</head>
<body>
<!--遍历Map集合-->
<c:forEach var="me" items="${fileMap}">
<c:url value="/servlet/downLoadServlet" var="downurl">
<c:param name="filename" value="${me.key}"></c:param>
</c:url>
${me.value}<a href="${downurl}">下载</a>
<br>
</c:forEach>
</body>
</html>
downLoadServlet.java
package servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
public class downLoadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String fileName=request.getParameter("filename");
String realName=fileName.substring(fileName.indexOf("_")+1);
String savePath=this.getServletContext().getRealPath("/WEB-INF/upload");
File file=new File(savePath+File.separator+fileName);
if (!file.exists()) {
request.setAttribute("message","下载的文件不存在");
request.getRequestDispatcher("/fileupload/message.jsp").forward(request,response);
return;
}
response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(realName,"UTF-8"));
OutputStream fos =response.getOutputStream();
FileInputStream fis = new FileInputStream(file);
byte[] buffer=new byte[1024];
int length=0;
while ((length = fis.read(buffer)) > 0) {
fos.write(buffer,0,length);
}
fos.close();
fis.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}