一、所需jar包:
commons-fileupload-1.2.1.jar、commons-io-1.4.jar
二、项目结构:
三、具体代码:
1.上传页面upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="<%=basePath %>/upload/uploadServlet.jsp" enctype="multipart/form-data" method="post">
上传用户:<input type="text" name="username"><br />
上传文件1:<input type="file" name="file1"><br />
<input type="submit" value="提交">
</form>
</body>
</html>
2.上传文件业务处理uploadServlet.jsp
<%@ page language="java" import="java.util.*,java.text.SimpleDateFormat,java.util.Date,java.io.*,org.apache.commons.fileupload.disk.*,org.apache.commons.fileupload.servlet.ServletFileUpload,org.apache.commons.fileupload.FileItem,org.apache.commons.fileupload.FileUploadException" pageEncoding="UTF-8" contentType="text/html"%>
<%@page import="java.sql.*,java.io.PrintWriter"%>
<%
response.setContentType("text/html;charSet=UTF-8");
request.setCharacterEncoding("UTF-8");
//保存路径
//String savePath = getServletContext().getRealPath("E://upload");
String savePath="E://upload";
File saveDir = new File(savePath);
// 如果目录不存在,就创建目录
if(!saveDir.exists()){
saveDir.mkdir();
}
// 创建文件上传核心类
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(factory);
//设置编码
sfu.setHeaderEncoding("UTF-8");
// 设置上传的单个文件的最大字节数为2M
//sfu.setFileSizeMax(1024*1024*2);
//设置整个表单的最大字节数为10M
sfu.setSizeMax(1024*1024*10);
try{
// 处理表单请求
List<FileItem> itemList = sfu.parseRequest(request);
for (FileItem fileItem : itemList) {
// 对应表单中的控件的name
String fieldName = fileItem.getFieldName();
System.out.println("控件名称:" + fieldName);
// 如果是普通表单控件
if(fileItem.isFormField()){
String value = fileItem.getString();
//重新编码,解决乱码
value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("普通内容:" + fieldName + "=" + value);
// 上传文件
}else{
// 获得文件大小
Long size = fileItem.getSize();
if(size>0){
// 获得文件名
String fileName = fileItem.getName();
System.out.println("文件名:"+fileName+"\t大小:" + size + "byte");
//设置不允许上传的文件格式
if(fileName.endsWith(".exe")){
request.setAttribute("message", "不允许上传的类型!");
}else{
//将文件保存到指定的路径
File file = new File(savePath,fileName);
fileItem.write(file);
request.setAttribute("message", "上传成功!");
}
}
}
}
}catch(FileUploadException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
request.setAttribute("message","abcdef123");
//上传完毕后 转发到首页
request.getRequestDispatcher("/upload/Message.jsp").forward(request, response);
%>
3.提示信息页面Message.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>消息提示</title>
</head>
<body>
${message}
</body>
</html>
4.列出上传过的文件列表处理代码ToListFileServlet.jsp
<%@ page language="java" import="java.util.*,java.text.SimpleDateFormat,java.util.Date,java.io.*,org.apache.commons.fileupload.disk.*,org.apache.commons.fileupload.servlet.ServletFileUpload,org.apache.commons.fileupload.FileItem,org.apache.commons.fileupload.FileUploadException" pageEncoding="UTF-8" contentType="text/html"%>
<%@page import="java.sql.*,java.io.PrintWriter"%>
<%
response.setContentType("text/html;charSet=UTF-8");
request.setCharacterEncoding("UTF-8");
//获取上传文件的目录
//String uploadFilePath = this.getServletContext().getRealPath("/WEB-INF/upload");
String uploadFilePath ="E://upload";
//存储要下载的文件名
Map<String,String> fileNameMap = new HashMap<String,String>();
//递归遍历filepath目录下的所有文件和目录,将文件的文件名存储到map集合中
listfile(new File(uploadFilePath),fileNameMap);//File既可以代表一个文件也可以代表一个目录
//将Map集合发送到listfile.jsp页面进行显示
request.setAttribute("fileNameMap", fileNameMap);
request.getRequestDispatcher("/download/listfile.jsp").forward(request, response);
%>
<%!
/**
* @Method: listfile
* @Description: 递归遍历指定目录下的所有文件
* @param file 即代表一个文件,也代表一个文件目录
* @param map 存储文件名的Map集合
*/
public void listfile(File file,Map<String,String> map){
//如果file代表的不是一个文件,而是一个目录
if(!file.isFile()){
//列出该目录下的所有文件和目录
File files[] = file.listFiles();
//遍历files[]数组
for(File f : files){
//递归
listfile(f,map);
}
}else{
//file.getName()得到的是文件的原始名称,这个名称是唯一的,因此可以作为key,realName是处理过后的名称,有可能会重复
map.put(file.getName(), file.getName());
}
}
%>
5.列表页面listfile.jsp
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML>
<html>
<head>
<title>下载文件显示页面</title>
</head>
<%
Map<String,String> map=(Map<String,String>)request.getAttribute("fileNameMap");
%>
<body>
<!-- 遍历Map集合 -->
<%
for (String str : map.keySet()) {
String str2 = map.get(str);//得到每个key多对用value的值
System.out.println(str + " " + str2);%>
<%=str %> <a href="<%=basePath %>/download/downServlet.jsp?filename=<%=str2 %>">下载</a><br>
<%}
%>
<table>
<tr>
<td>
<div></div>
</td>
</tr>
</table>
</body>
</html>
6.下载处理代码downServlet.jsp
<%@ page language="java" import="java.util.*,java.io.*,java.util.Map.Entry,java.text.SimpleDateFormat,java.util.Date,net.sf.json.JSONArray,net.sf.json.JSONObject,java.net.URLEncoder,java.net.URLDecoder,com.ultrapower.eoms.common.portal.model.UserSession,cn.com.ultrapower.baseline.dao.BaseDAO,org.apache.commons.fileupload.disk.*,org.apache.commons.fileupload.servlet.ServletFileUpload,org.apache.commons.fileupload.FileItem,org.apache.commons.fileupload.FileUploadException,cn.com.ultrapower.baseline.common.DynamicReadConfig" pageEncoding="UTF-8" contentType="text/html"%>
<%@page import="java.sql.*,java.io.PrintWriter"%>
<%
response.setContentType("text/html;charSet=UTF-8");
request.setCharacterEncoding("UTF-8");
try{
//得到要下载的文件名
String fileName = request.getParameter("filename");//要下载匹配的文件名
String fileName2 = request.getParameter("filename2");//要下载文件的真实名称
fileName=URLDecoder.decode(fileName,"utf-8");
fileName2=URLDecoder.decode(fileName2,"utf-8");//可能有中文或其他字符
String fileSaveRootPath = DynamicReadConfig.getConfigProperty("attachment.pathbak2");
//String fileSaveRootPath="D:\\upload";
//=======
File file = new File(fileSaveRootPath+"\\"+fileName);
//如果文件不存在
if(!file.exists()){
request.setAttribute("message", "您要下载的资源:"+fileName+" 已经不存在");
request.getRequestDispatcher("/local/notice/notice_downloadMessag.jsp").forward(request, response);
return;
}
//以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(fileSaveRootPath+"\\"+fileName));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
response.reset();
response.setContentType("application/x-msdownload");
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName2, "UTF-8"));
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
//=========
}catch(IllegalStateException e){
e.printStackTrace();
}
%>