需要:commons-io.jar 和 commons-fileupload.jar
upload.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type="text/javascript">
//全局变量
var time = 0;
function addLine(addButton){
//创建内部div对象
var divElement = document.createElement("div");
//创建input对象[file类型]
var inputElement1 = document.createElement("input");
inputElement1.type="file";
inputElement1.name="upfile";
//创建input对象[button类型]
var inputElement2 = document.createElement("input");
inputElement2.type="button";
inputElement2.value="删除";
//对删除按钮添加事件监听
inputElement2.οnclick=function(){
//取得该按钮所在行的直接父元素
var divElement = this.parentNode.parentNode;
//通过父元素删除直接子元素
divElement.removeChild(this.parentNode);
time--;
if(time < 5){
//按钮生效
addButton.disabled=false;
//addButton.style.visibility="visible";
}
}
//依次将file类型和button类型的input对象加入到内部div对象中
divElement.appendChild(inputElement1);
divElement.appendChild(inputElement2);
//再次内部div对象加入到外部div对象
var outDivElement = document.getElementById("outDiv");
outDivElement.appendChild(divElement);
time++;
if(time == 5){
//将按钮失效
addButton.disabled=true;
//addButton.style.visibility="hidden";
}
}
</script>
</head>
<body>
<form
action="${pageContext.request.contextPath}/UploadServlet"
method="POST"
enctype="multipart/form-data">
<table border="1" align="center">
<caption>文件上传</caption>
<tr>
<th>上传用户</th>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<th></th>
<td>
<div id="outDiv">
<%--
<div>
<input type="file" name="upfile"/>
<input type="button" value="删除"/>
</div>
--%>
</div>
</td>
</tr>
<tr>
<th></th>
<td>
<input
type="button"
value="添加上传文件"
οnclick="addLine(this)"
/>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="上传"/>
<a href="${pageContext.request.contextPath}/ListFileServlet">
显示下载文件
</a>
</td>
</tr>
</table>
</form>
</body>
</html>
UploadServlet.java
package cn.itcast.web.servlet.upload;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import cn.itcast.web.servlet.util.UploadUtil;
public class UploadServlet3 extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//创建上传文件工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置内存中缓存区的大小,默认10K
factory.setSizeThreshold(100*1024);
//设置上传文件临时存放的目录
String tempPath = this.getServletContext().getRealPath(UploadUtil.tempPath);
factory.setRepository(new File(tempPath));
//创建上传文件对象[核心]
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件的中文编码方式
upload.setHeaderEncoding("UTF-8");
//客户端上传文件是否使用MIME协议,
boolean flag = upload.isMultipartContent(request);
if(!flag){
//不是以MIME协议上传文件
throw new ServletException();
}else{
/*是以MIME协议上传的文件,解析request中的所有上传内容
*每个内容封装成一个对象FileItem,
*FileItem代表普通字段和上传字段二类
*/
try {
List<FileItem> fileItemList = upload.parseRequest(request);
for(FileItem fileItem : fileItemList){
if(fileItem.isFormField()){
//必定是普通字段
String fieldName = fileItem.getFieldName();
String fieldValue = fileItem.getString("UTF-8");
System.out.println(fieldName+":"+fieldValue);
}else {
//必定是上传字段
String realFileName = fileItem.getName();
//取得真实文件名
realFileName = UploadUtil.getRealFileName(realFileName);
//通过真实文件名换算出唯一个文件名
String uuidFileName = UploadUtil.makeUuidFileName(realFileName);
//通过位运算换算出upload目录下的子目录
String uploadPath = this.getServletContext().getRealPath(UploadUtil.uploadPath);
String uuidFilePath = UploadUtil.makeUuidFilePath(uploadPath,uuidFileName);
//取得文件输入流
InputStream is = fileItem.getInputStream();
//取得文件输出流
UploadUtil.doSave(is,uuidFileName,uuidFilePath);
//将上传文件产生的临时文件删除
fileItem.delete();
request.setAttribute("message","上传文件成功");
request.getRequestDispatcher("/WEB-INF/message.jsp").forward(request,response);
}
}
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("message","上传文件失败");
request.getRequestDispatcher("/WEB-INF/message.jsp").forward(request,response);
}
}
}
}
list.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<table border="1" align="center">
<caption>下载文件列表</caption>
<tr>
<th>文件名</th>
<th>操作</th>
</tr>
<c:forEach var="entry" items="${requestScope.map}">
<tr>
<td>${entry.value}</td>
<td>
<c:url var="myURL" value="/DownloadServlet">
<c:param name="uuidFileName" value="${entry.key}"/>
</c:url>
<a href="${myURL}"
style="text-decoration:none">
下载
</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
DownloadServlet.java
package cn.itcast.web.servlet.download;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.web.servlet.util.UploadUtil;
//下载文件到本地
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String uuidFileName = request.getParameter("uuidFileName");
byte[] buf = uuidFileName.getBytes("ISO8859-1");
uuidFileName = new String(buf,"UTF-8");
int index = uuidFileName.lastIndexOf("_");
String realFileName = uuidFileName.substring(index+1);
response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(realFileName,"UTF-8"));
String uploadPath = this.getServletContext().getRealPath(UploadUtil.uploadPath);
String uuidFilePath = UploadUtil.makeUuidFilePath(uploadPath,uuidFileName);
InputStream is = new FileInputStream(uuidFilePath+"/"+uuidFileName);
//模式:/WEB-INF/upload/12/4/43213_cc.jpg
OutputStream os = response.getOutputStream();
buf = new byte[1024];
int len = 0;
while((len=is.read(buf))>0){
os.write(buf,0,len);
}
is.close();
os.close();
}
}