以Apache组织的commons项目中的FileUpload项目做为jsp的文件上传组件。
在开始之前你要准备以下几个东西:
1. commons-FileUpload 包
下载地址:http://commons.apache.org/fileupload/
2. commons-IO 包
下载地址:http://commons.apache.org/io/
3. Commons-BeanUtils 包
下载地址:http://commons.apache.org/beanutils/
准备工作完成就开始了:
1、新建一个WEB项目upload;
2、把下载好了的jar包复制到项目的WEB-INF/lib目录下;
3、新建或修改JSP文件:
<%@ page language="java" import="java.util.*" 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"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> This is my upload JSP page. <br> <form name="upform" action="UploadServlet" method="POST" enctype="multipart/form-data"> <input type="file" name="file1" id="file1" /> <br /> <input type="file" name="file2" if="file2" /> <br /> <input type="file" name="file3" id="file3" /> <br /> <input type="text" name="text1" id="text1" /> <br /> <input type="submit" value="Submit" /> <input type="reset" /> </form> </body> </html>
上面有几个要注意的地方:
a、method在这时必须是post的;
b、enctype="multipart/form-data"使表单提交的流而不是表单文本。
4、书写UploadServlet.java
package demo.servlet; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.FileItemStream; import org.apache.commons.fileupload.ProgressListener; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.util.Streams; /** * Servlet implementation class for Servlet: UploadServlet */ public class UploadServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { /** 初始化上传文件的临时存放目录 */ File tmpDir = null; /** 初始化上传文件后的保存目录 */ File saveDir = null; public UploadServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); try { // 检查是否是文件上传类型的请求 enctype="multipart/form-data" if (ServletFileUpload.isMultipartContent(request)) { // 创建一个基于磁盘的文件项目 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setRepository(tmpDir);// 指定上传文件的临时目录 factory.setSizeThreshold(1024000);// 指定在内存中缓存数据大小,单位为byte // 创建一个新的文件上传处理程序 ServletFileUpload upload = new ServletFileUpload(factory); upload.setFileSizeMax(5000000);// 指定单个上传文件的最大尺寸 upload.setSizeMax(10000000);// 指定一次请求上传多个文件的总尺寸 // 解析request请求,并执行相应操作 FileItemIterator fileItems = upload.getItemIterator(request); while (fileItems.hasNext()) { // 从集合中获得一个文件流 FileItemStream fileItemStream = fileItems.next(); String name = fileItemStream.getFieldName();// 界面document的name值 InputStream stream = fileItemStream.openStream(); // 过滤掉表单中的非文件域 if (!fileItemStream.isFormField() && fileItemStream.getName().length() > 0) { // 获得上传文件的文件名 String fileName = fileItemStream.getName(); // 获得文件输入流 BufferedInputStream in = new BufferedInputStream(stream); // 获得文件输出流 BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(new File(saveDir + System.getProperty("file.separator") + fileName))); // 开始把文件写到指定的上传文件夹 Streams.copy(in, out, true); response.getWriter().println("File upload successfully!!!");// 成功,到上传文件夹中看看,上传的东西齐了吗 } else { System.out.println("Form field " + name + " with value " + Streams.asString(stream) + " detected."); } } } } catch (Exception e) { e.printStackTrace(); } } public void init() throws ServletException { /* * 对上传文件夹和临时文件夹进行初始化 */ super.init(); String tmpPath = "d:" + System.getProperty("file.separator") + "tmpdir"; String savePath = "d:" + System.getProperty("file.separator") + "updir"; tmpDir = new File(tmpPath); saveDir = new File(savePath); if (!tmpDir.isDirectory()) tmpDir.mkdir(); if (!saveDir.isDirectory()) saveDir.mkdir(); } }
附:还有另外一种不是直接得到数据流的处理方法
List /* FileItem */ items = upload.parseRequest(request); Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (!item.isFormField()) { String fieldName = item.getFieldName(); String fileName = item.getName(); String contentType = item.getContentType(); boolean isInMemory = item.isInMemory(); long sizeInBytes = item.getSize(); System.out.println("upload field : fieldName=" + fieldName + " ! fileName=" + fileName +" ! contentType=" + contentType + " ! isInMemory=" + isInMemory + " ! sizeInBytes=" + sizeInBytes); // 获得文件输入流 BufferedInputStream in = new BufferedInputStream(item.getInputStream()); // 获得文件输出流 BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(new File(saveDir + System.getProperty("file.separator") + fileName))); // 开始把文件写到指定的上传文件夹 Streams.copy(in, out, true); response.getWriter().println("File upload successfully!!!");// 成功,到上传文件夹中看看,上传的东西齐了吗 } else { String name = item.getFieldName(); String value = item.getString(); System.out.println("form field : name=" + name + " ! value=" + value); } }
5、最后配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>demo.servlet.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/UploadServlet</url-pattern> </servlet-mapping> </web-app>
到次久算写完了,部署启动tomcat,访问http://localhost:8080/upload/
附上工程
参考: