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

<?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 {

	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	public 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 {

	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	public 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 用户指导

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值