apache commons fileupload 处理文件上传的两种方式(流式和非流式)

来源:互联网 发布:淘宝免费货源怎么找 编辑:程序博客网 时间:2024/06/06 20:10
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><listener><listener-class>org.apache.commons.fileupload.servlet.FileCleanerCleanup</listener-class></listener><servlet><servlet-name>FileServlet</servlet-name><servlet-class>com.wxl.app.FileServlet</servlet-class></servlet><servlet-mapping><servlet-name>FileServlet</servlet-name><url-pattern>/upload</url-pattern></servlet-mapping><servlet><servlet-name>StreamFileServlet</servlet-name><servlet-class>com.wxl.app.StreamFileServlet</servlet-class></servlet><servlet-mapping><servlet-name>StreamFileServlet</servlet-name><url-pattern>/stream/upload</url-pattern></servlet-mapping></web-app>


package com.wxl.app;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Iterator;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.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.FileCleanerCleanup;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.apache.commons.io.FileCleaningTracker;import org.apache.commons.io.IOUtils;public class FileServlet extends HttpServlet {@Overridepublic void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}@Overridepublic void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {req.setCharacterEncoding("UTF-8");if (ServletFileUpload.isMultipartContent(req)) {// 文件上传请求// 创建文件项工厂FileCleaningTracker fileCleaningTracker = FileCleanerCleanup.getFileCleaningTracker(this.getServletContext());DiskFileItemFactory factory = new DiskFileItemFactory();factory.setFileCleaningTracker(fileCleaningTracker);// 由内存存储到磁盘存储的临界值,默认为10KB// factory.setSizeThreshold(yourMaxMemorySize);// 文件上传的临时目录,默认为System.getProperty("java.io.tmpdir")// factory.setRepository(yourTempDirectory);// 创建文件上传处理器ServletFileUpload upload = new ServletFileUpload(factory);// 设置编码方式// upload.setHeaderEncoding("UTF-8");// 设置单个请求的大小,默认为不限制// upload.setSizeMax(yourMaxRequestSize);// 设置单个文件的大小,默认为不限制// upload.setFileSizeMax(yourFileSizeMax);try {// 解析请求List<FileItem> items = upload.parseRequest(req);// 处理上传项Iterator<FileItem> iter = items.iterator();while (iter.hasNext()) {FileItem item = (FileItem) iter.next();if (item.isFormField()) {System.out.println("---------------普通表单项");String name = item.getFieldName();System.out.println("FieldName: " + name);String value = item.getString("UTF-8");System.out.println("FieldValue: " + value);} else {System.out.println("---------------文件表单项");String fieldName = item.getFieldName();System.out.println("FieldName: " + fieldName);String fileName = item.getName();System.out.println("FileName: " + fileName);String contentType = item.getContentType();System.out.println("ContentType: " + contentType);InputStream is = item.getInputStream();OutputStream os = new FileOutputStream(new File("c:/"+ fileName));IOUtils.copy(is, os);IOUtils.closeQuietly(is);IOUtils.closeQuietly(os);}}} catch (FileUploadException e) {e.printStackTrace();}} else {// 非文件上传请求throw new RuntimeException("非文件上传请求");}}}

package com.wxl.app;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItemIterator;import org.apache.commons.fileupload.FileItemStream;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.apache.commons.fileupload.util.Streams;import org.apache.commons.io.IOUtils;public class StreamFileServlet extends HttpServlet {@Overridepublic void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}@Overridepublic void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {req.setCharacterEncoding("UTF-8");if (ServletFileUpload.isMultipartContent(req)) {// 创建一个文件上传处理器ServletFileUpload upload = new ServletFileUpload();// 解析请求FileItemIterator iter;try {iter = upload.getItemIterator(req);while (iter.hasNext()) {FileItemStream item = iter.next();InputStream stream = item.openStream();if (item.isFormField()) {System.out.println("---------------普通表单项");String name = item.getFieldName();System.out.println("FieldName: " + name);String value = Streams.asString(stream, "UTF-8");System.out.println("FieldValue: " + value);} else {System.out.println("---------------文件表单项");String fieldName = item.getFieldName();System.out.println("FieldName: " + fieldName);String fileName = item.getName();System.out.println("FileName: " + fileName);OutputStream os = new FileOutputStream(new File("c:/"+ fileName));IOUtils.copy(stream, os);IOUtils.closeQuietly(stream);IOUtils.closeQuietly(os);}}} catch (FileUploadException e) {e.printStackTrace();}}}}

<%@ 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 'upload.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><form action="upload" method="post" enctype="multipart/form-data"><input type="text" name="name"/><br/><input type="file" name="file"/><br/><input type="submit" value="提交"/></form></body></html>

<%@ 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 'upload.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><form action="stream/upload" method="post" enctype="multipart/form-data"><input type="text" name="name"/><br/><input type="file" name="file"/><br/><input type="submit" value="提交"/></form></body></html>

使用非流式处理上传时,临时文件存放在System.getProperty("java.io.tmpdir")目录下,如果用的是tomcat容器,那么临时文件是存放在CATALINA_HOME/temp目录下的。
FileCleanerCleanup貌似没起作用,下次改进。

参考apache commons fileupload 用户指导

0 1