maven servlet上传文件

这里我创建了一个maven工程,直接添加下载的依赖,为何选择maven?由于个人目的是为了完成上传,而不是为了去配置环境~!在上传的时候,必需要添加io这个依赖的包,若是我这里用的是servlet,就须要添加对应的javax.servlet依赖,这是很重要的。另外,在表单提交的时候,enctype="multipart/form-data"是必需要填的,这个在w3c文档里有明确规定,而对于上传的路径、怎么上传等这些则是次要的,因此我没有过多的去判断有什么类型的文件,也就是说,这里我是为了实现servlet上传而实现上传。    这是最基本的原理,不管你是spring mvc上传仍是struts2,其实原理都是差很少的。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<form action="uploadServlet" method="post" enctype="multipart/form-data">
		选择文件:<input type="file" name="file" /><br>
		<input type="submit" value="提交" >
	</form>
	
</body>
</html>
<?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">
	<display-name>Servlet Upload Web Application</display-name>
	
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	
	<servlet>
		<servlet-name>uploadServlet</servlet-name>
		<servlet-class>com.iflytek.test.MyUploadServlet</servlet-class>
		<init-param>
			<param-name>fileName</param-name>
			<param-value>myUploadServlet</param-value>
		</init-param>
		<init-param>
			<param-name>cachePath</param-name>
			<param-value>cachePath</param-value>
		</init-param>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>uploadServlet</servlet-name>
		<url-pattern>/uploadServlet</url-pattern>
	</servlet-mapping>
		
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: pom.xml 642118 2008-03-28 08:04:16Z reinhard $ -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

	<modelVersion>4.0.0</modelVersion>
	<packaging>war</packaging>

	<name>ServletUploadTrain</name>
	<groupId>com.iflytek.test</groupId>
	<artifactId>ServletUploadTrain</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<build>
		<plugins>
			<plugin>
				<groupId>org.mortbay.jetty</groupId>
				<artifactId>maven-jetty-plugin</artifactId>
				<version>6.1.7</version>
				<configuration>
					<connectors>
						<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
							<port>8888</port>
							<maxIdleTime>30000</maxIdleTime>
						</connector>
					</connectors>
					<webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}</webAppSourceDirectory>
					<contextPath>/</contextPath>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<dependencies>
	
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
		</dependency>

		<!-- common-io包 -->
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>

		<!-- fileupload上传配置 -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.2.2</version>
		</dependency>

		<!-- serlvet配置 -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>

	</dependencies>

</project>
package com.iflytek.test;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class MyUploadServlet extends HttpServlet {

	/**
	 * 文件存放地址
	 */
	private String file_path;
	
	/**
	 * 缓存路径
	 */
	private File cacheFile;

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest
	 * , javax.servlet.http.HttpServletResponse)
	 */
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		this.doPost(req, resp);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest
	 * , javax.servlet.http.HttpServletResponse)
	 */
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//super.doPost(req, resp);
		// resp.setContentType("text/plain");
		// 设置字符集
		resp.setCharacterEncoding("GBK");
		//
		PrintWriter printWriter = resp.getWriter();

		// 建立一个基于硬盘的工厂,通常用来缓冲
		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setSizeThreshold(5*1024);
		//设置缓存文件
		factory.setRepository(cacheFile);
		
		ServletFileUpload fileUpload = new ServletFileUpload(factory);
		// 页面请求传递的信息量的最大值为20M
		fileUpload.setSizeMax(20 * 1024 * 1204);
		// 设置单个文件传递的大小为6m
		fileUpload.setFileSizeMax(6 * 1024 * 1024);

		try {
			List<FileItem> list = fileUpload.parseRequest(req);

			for (FileItem fileItem : list) {
				if (fileItem.isFormField()) {
					// 提交的是表单元素
					this.processFormFileld(fileItem, printWriter);
				} else {
					this.processUploadFile(fileItem, printWriter);
				}
			}

		} catch (FileUploadException e) {
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 若是表单中的是文件信息格式,则将文件保存到指定的目录下
	 * 
	 * @param fileItem
	 *            文件信息
	 * @param printWriter
	 *            输出打印对象
	 */
	private void processUploadFile(FileItem fileItem, PrintWriter printWriter)
			throws Exception {

		String filename = fileItem.getFieldName();
		int index = filename.lastIndexOf("\\");
		filename = filename.substring(index + 1, filename.length());
		long file_size = fileItem.getSize();

		if ("".equals(filename) && file_size == 0) {
			return;
		}

		File upload_file = new File(file_path + "/" + filename);
		// 系统会自动将临时文件删除
		fileItem.write(upload_file);
		printWriter.println("<p>文件" + filename + "上传成功!</p>");
		printWriter.println("<p>文件[" + filename + "]的大小为" + file_size + "</p>");
	}

	/**
	 * 若是表单的信息为文本信息,则打印简单的提示
	 * 
	 * @param fileItem
	 *            文本信息
	 * @param printWriter
	 *            输出打印对象
	 */
	private void processFormFileld(FileItem fileItem, PrintWriter printWriter)
			throws Exception {

		String name = fileItem.getFieldName();
		String value = fileItem.getString();
		printWriter.println("<p>" + name + ":" + value + "</p>");

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig)
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		// 查询要上传文件所在的文件夹是否存在,如不存在就创建一个文件夹
		String fileName = config.getInitParameter("fileName");
		String cachePath = config.getInitParameter("cachePath");
		
		// 经过虚拟的初始化参数来构建一个真实的文件路径
		file_path = this.getServletContext().getRealPath(fileName);
		cachePath = this.getServletContext().getRealPath(cachePath);
		
		File realFile = new File(file_path);
		cacheFile = new File(cachePath);

		if(!cacheFile.exists()){
			cacheFile.mkdirs();
		}
		
		if (!realFile.exists()) {
			// 创建一些列路径
			realFile.mkdirs();
		}
		
	}
}