通过Servlet文件上传理解Struts2文件上传原理(附源码)

package mypack;

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

import javax.servlet.ServletConfig;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadServlet extends HttpServlet{
	private String filePath;// 存放上传文件的目录
	private String tempFilePath;// 存放临时文件的目录

	@Override
	public void init(ServletConfig config) throws ServletException{
		super.init(config);
		filePath = config.getInitParameter("filePath");
		System.out.println("filePath1::"+filePath);
		tempFilePath = config.getInitParameter("tempFilePath");
		//上面从web.xml中得到临时文件和保存文件的目录名
		System.out.println("tempFilePath1::"+tempFilePath);
		filePath = this.getServletContext().getRealPath(filePath);
		System.out.println("filePath2::"+filePath);
		tempFilePath = this.getServletContext().getRealPath(tempFilePath);
		System.out.println("tempFilePath2::"+tempFilePath);
		//上面从web.xml中得到临时文件和保存文件的完整路径
	}

	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException,IOException{
		response.setContentType("text/plain");
		// 向客户端发送响应正文
		//得到response输出流
		PrintWriter outNet = response.getWriter();

		try
		{
			// 创建一个基于硬盘的FileItem工厂
			DiskFileItemFactory factory = new DiskFileItemFactory();
			// 设置向硬盘写数据时所用的缓冲区的大小,此处为4K
			factory.setSizeThreshold(4*1024);
			// 设置临时目录
			factory.setRepository(new File(tempFilePath));

			// 创建一个文件上传处理器
			ServletFileUpload upload = new ServletFileUpload(factory);
			// 设置允许上传的文件的最大尺寸,此处为4M
			upload.setSizeMax(4*1024*1024);

			List items = upload.parseRequest(request);
			Iterator iter = items.iterator();
			while(iter.hasNext())
			{
				FileItem item = (FileItem)iter.next();
				if(item.isFormField())
				{
					processFormField(item,outNet); // 处理普通的表单域
				}
				else
				{
					processUploadedFile(item,outNet); // 处理上传文件
				}
			}
			outNet.close();
		}catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}

	private void processFormField(FileItem item,PrintWriter outNet){
		String name = item.getFieldName();
		String value = item.getString();
		outNet.println(name+":"+value+"\r\n");
	}

	private void processUploadedFile(FileItem item,PrintWriter outNet)
			throws Exception{
		String filename = item.getName();
		int index = filename.lastIndexOf("\\");
		filename = filename.substring(index+1,filename.length());
		long fileSize = item.getSize();

		if(filename.equals("")&&fileSize==0)
			return;

		File uploadFile = new File(filePath+"/"+filename);
		item.write(uploadFile);
		outNet.println(filename+" is saved.");
		outNet.println("The size of "+filename+" is "+fileSize+"\r\n");
	}
}

 

<?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">
	
	<servlet>
		<servlet-name>UploadServlet</servlet-name>
		<servlet-class>mypack.UploadServlet</servlet-class>
		<init-param>
			<param-name>filePath</param-name>
			<param-value>store</param-value>
		</init-param>
		<init-param>
			<param-name>tempFilePath</param-name>
			<param-value>temp</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>UploadServlet</servlet-name>
		<url-pattern>/upload</url-pattern>
	</servlet-mapping>

	<welcome-file-list>
		<welcome-file>upload.htm</welcome-file>
	</welcome-file-list>
</web-app>

 

<html>
	<head>
		<title>Upload</title>
	</head>
	<body>
		<form name="uploadForm" method="POST" enctype="MULTIPART/FORM-DATA" action="upload">
			<table>
				<tr>
					<td>
						<div align="right">
							User Name:
						</div>
					</td>
					<td>
						<input type="text" name="username" size="30" />
					</td>
				</tr>
				<tr>
					<td>
						<div align="right">
							Upload File1:
						</div>
					</td>
					<td>
						<input type="file" name="file1" size="30" />
					</td>
				</tr>
				<tr>
					<td>
						<div align="right">
							Upload File2:
						</div>
					</td>
					<td>
						<input type="file" name="file2" size="30" />
					</td>
				</tr>
				<tr>
					<td>
						<input type="submit" name="submit" value="upload">
					</td>
					<td>
						<input type="reset" name="reset" value="reset">
					</td>
				</tr>
			</table>
		</form>
	</body>
</html>

你可能感兴趣的:(servlet)