Notice:
1. form表单 method 属性必须设置为 POST 方法 ,不能使用 GET 方法
2. form表单 enctype 属性需要设置为 multipart/form-data
3. form表单 action 属性需要设置为提交到后台处理文件上传的jsp文件地址或者servlet地址。例如 uploadFile.jsp 程序文件用来处理上传的文件
4. 上传文件元素需要使用 标签,属性设置为 type="file"。如果需要上传多个文件,可以在 标签中设置不同的名称
Steps
首先我们先定义文件上传后存储在服务上的位置,你可以将路径写在你的程序当中,或者我们可以在web.xml配置文件中通过设置 context-param 元素来设置文件存储的目录
file_upload_dir F:\files_uploaded Location to store uploaded files
依赖 FileUpload, 所以你需要在你的classpath中引入最新的 commons-fileupload.x.x.jar 包文件
FileUpload 依赖 Commons IO, 所以你需要在你的classpath中引入最新的 commons-io-x.x.jar
commons-fileupload commons-fileupload 1.2.2 org.apache.commons commons-io 1.3.2
在测试以下实例时,你需要上传确认上传的文件大小小于 maxFileSize 变量设置的大小 ,否则文件无法上传成功
确保你已经创建了目录F:\files_uploaded
fileupload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Up load file
processFileUpload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%> <%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%> <%@ page import="java.io.*,java.util.*,javax.servlet.*" %> <%@ page import="org.apache.commons.fileupload.*" %>Insert title here <% File file; int maxSize = 1024*1024*1024; int maxMemSize = 1024*1024; ServletContext ctx = pageContext.getServletContext(); String filePath = ctx.getInitParameter("file_upload_dir"); String contentType = request.getContentType(); if(ServletFileUpload.isMultipartContent(request)) { DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(maxMemSize); //设置内存中存储文件的最大值 factory.setRepository(new File("F:\\tmp")); ServletFileUpload servlet = new ServletFileUpload(factory); servlet.setSizeMax(maxSize); //设置最大的上传文件大小 try { List items = servlet.parseRequest(request); out.println(items.size()); Iterator it = items.iterator(); while(it.hasNext()) { FileItem item = (FileItem) it.next(); String fieldName = item.getFieldName(); String fileName = item.getName(); boolean isInMemory = item.isInMemory(); long sizeInBytes = item.getSize(); if(fileName.lastIndexOf("\\") >= 0) { file = new File(filePath, fileName.substring(fileName.lastIndexOf("\\"))); } else { file = new File(filePath, fileName.substring(fileName.lastIndexOf("\\")+1)); } item.write(file); out.println("Uploaded file: " + fileName); } } catch (Exception e) { e.printStackTrace(); } } %>
NOTE:
代码copy自网络,起初,processFileUpload.jsp中的List items = servlet.parseRequest(request);得到的总是空集合,网上也有很多遇到这种情况的,原因 在fileupload.jsp: name="fileSelected" , 如果没有name标记,commons fielupload不会作处理
servlet.setHeaderEncoding("UTF-8");中文名不会乱码
2. servlet上传
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import javax.servlet.ServletContext; 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.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 849325874174997377L; private static final int sizeThreshold = 1024*1024*1024; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println(".....doGet....."); super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { DiskFileItemFactory factory = new DiskFileItemFactory(); ServletContext ctx = this.getServletContext(); String filePath = ctx.getInitParameter("file_upload_dir"); factory.setRepository(new File(filePath)); factory.setSizeThreshold(sizeThreshold); ServletFileUpload upload = new ServletFileUpload(factory); try { @SuppressWarnings("unchecked") Listlist = upload.parseRequest(req); for(FileItem item : list) { String name = item.getFieldName(); if(item.isFormField()) { // String value = item.getString(); // req.setAttribute(name, value); } else { String value = item.getName(); String fileName = value.substring(value.indexOf("\\")+1); req.setAttribute(name, fileName); OutputStream os = new FileOutputStream(new File(filePath, fileName)); InputStream is = item.getInputStream(); byte[] buff = new byte[1024]; System.out.println("The length of " + value + " is " + item.getSize()); int length = 0; while((length = is.read(buff)) != -1) { os.write(buff, 0, length); } is.close(); os.close(); } } } catch (FileUploadException e) { e.printStackTrace(); } req.getRequestDispatcher("pages/upload_result.jsp").forward(req, resp); } }
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class EncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init EncodingFilter...."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); System.out.println("set the encoding to be utf-8 in EncodingFilter..."); chain.doFilter(request, response); } @Override public void destroy() { System.out.println("destroy EncodingFilter...."); } }
fileupload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Up load file
upload_result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here File <%=request.getAttribute("fileSelected") %> uploaded successfully.
web.xml
Archetype Created Web Application file_upload_dir F:\files_uploaded Location to store uploaded files EncodingFilter com.jesse.jsp.filter.EncodingFilter EncodingFilter /* fileUploadServlet com.jesse.jsp.servlet.FileUploadServlet fileUploadServlet /fileupload