需要: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.onclick=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="添加上传文件" onclick="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.javapackage 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.javapackage 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(); }}
新闻热点
疑难解答