servlet fileupload上传文件

版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原文出处, 即下面的声明. 
原文出处:http://tbwuming.iteye.com/admin/blogs/1520140

1. maven依赖

<dependency>
	<groupId>commons-fileupload</groupId>
	<artifactId>commons-fileupload</artifactId>
	<version>1.2.2</version>
</dependency>
 

2. fileload处理类

import java.io.File;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

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;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FileUpload {
	private static final Logger logger = LoggerFactory.getLogger(FileUpload.class);

	private static final int DEFAULT_SIZE_THRESHOLD = 1 * 1024 * 1024;
	private static final long DEFAULT_MAX_FILE_SIZE = 8 * 1024 * 1024;

	private String uploadPath;
	private String tempPath;

	private Integer thresholdSize;
	private Long maxFileSize;

	private ServletFileUpload upload;

	// 初始化fileload
	public void init() {
		DiskFileItemFactory diskFactory = new DiskFileItemFactory();

		// 设置文件大小超过缓存时所存放的目录
		diskFactory.setRepository(new File(tempPath));

		// 设置缓存大小
		if (thresholdSize == null)
			diskFactory.setSizeThreshold(DEFAULT_SIZE_THRESHOLD);
		else
			diskFactory.setSizeThreshold(thresholdSize);

		upload = new ServletFileUpload(diskFactory);

		// 设置最大可上传的文件大小
		if (maxFileSize == null)
			upload.setSizeMax(DEFAULT_MAX_FILE_SIZE);
		else
			upload.setSizeMax(maxFileSize);
	}

	// 获取文件列表
	@SuppressWarnings("unchecked")
	public List<FileItem> getFileItems(HttpServletRequest request) {
		List<FileItem> fileItems = null;

		try {
			fileItems = (List<FileItem>) upload.parseRequest(request);
		} catch (FileUploadException e) {
			logger.error("process upload request error", e);
		}

		return fileItems;
	}

	public File process(PrintWriter out, FileItem item, Throwable throwable) {
		String filename = item.getName();

		logger.info("full filename:" + filename);

		if (StringUtils.isBlank(filename)) {
			logger.warn("filename {} is null", filename);
			return null;
		}

		// linux和windows路径分隔符不一样,因此处理
		int index = filename.lastIndexOf("/");
		if (index == -1)
			index = filename.lastIndexOf("\\");

		// 获取文件名
		filename = filename.substring(index + 1, filename.length());

		long fileSize = item.getSize();

		if (StringUtils.isBlank(filename) || fileSize == 0) {
			logger.warn("filename {} is empty", filename);
			return null;
		}

		// 写文件
		String pathname = uploadPath + "/" + filename;
		File uploadFile = new File(pathname);
		try {
			item.write(uploadFile);
		} catch (Exception e) {
			throwable = e;
			logger.error("write file error, file={}", pathname, e);
		}

		out.println(filename + " file upload complete ...");
		out.println("file size:" + fileSize + "\r\n");

		return uploadFile;
	}

	public void setUploadPath(String uploadPath) {
		this.uploadPath = uploadPath;
	}

	public void setTempPath(String tempPath) {
		this.tempPath = tempPath;
	}

	public void setThresholdSize(Integer thresholdSize) {
		this.thresholdSize = thresholdSize;
	}

	public void setMaxFileSize(Long maxFileSize) {
		this.maxFileSize = maxFileSize;
	}
	
}

3. servlet

import java.io.IOException;
import java.io.PrintWriter;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = -5562457977157562484L;
	private static final Logger logger = LoggerFactory.getLogger(UploadServlet.class);

	private FileUpload fileUpload;

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/plain;charset=utf-8");
		PrintWriter out = response.getWriter();

		List<FileItem> fileItems = (List<FileItem>) fileUpload.getFileItems(request);
		for (FileItem item : fileItems) {
			if (!item.isFormField()) {
				Throwable throwable = null;
				fileUpload.process(out, item, throwable);
			}
		}

		logger.info("upload file success");
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
			IOException {
		doGet(request, response);
	}

	public void setFileUpload(FileUpload fileUpload) {
		this.fileUpload = fileUpload;
	}

}
 

4. html 内容

<html> 
    <head>  
    	<title>上传文件</title>
    </head>
     
    <body> 
		<center>
			<form name="uploadForm" method="post" enctype="multipart/form-data" action="/upload">
				<table>
					<tr>
						<th colspan="2">
							上传文件
						</th>
					</tr>
					<tr>
						<td>
							Upload File:
						</td>
						<td>
							<input type="file" name="uploadFilename" size="30"/> 
						</td>
					</tr>
					<tr>
						<td align="center" colspan="2">					
							<input type="submit" name="submit" value="上传"> 
							&nbsp;&nbsp;&nbsp;&nbsp;
							<input type="reset" name="reset" value="重置"> 
						</td>
					</tr>
			</form> 
		</center>
    </body> 
</html>

 说明:

1). form提交模式需要是post模式,当页面传输内容比较大的时候一般时候post方式

2). 指明enctype为multipart/form-data类型

3). action中指定servlet访问相对路径

5. spring配置

<bean class="com.taobao.crawler.web.UploadServlet">
	<property name="fileUpload" ref="fileUpload" />
</bean>

<bean id="fileUpload" class="com.taobao.crawler.web.FileUpload" init-method="init">
        <property name="uploadPath" value="./config" />
	<property name="tempPath" value="./temp" />
</bean>

猜你喜欢

转载自tbwuming.iteye.com/blog/1534924