使用文件上传至服务器需要导入两包commons-fileupload-1.2.2.jar与commons-io-2.4.jar

本文的servlet使用的是 servlet3.0注解配置,   不用写web.xml 文件了

建立文件时使用javaEE6.0 支持servlet3.0

value的值就是访问路径
urlPatterns的值也是访问路径  例如
@WebServlet(name="DemoServlet3",value="/demoServlet3")
public class DemoServlet3 extends HttpServlet {
...
}

文件上传的表单

method 必须是post
enctype="multipart/form-data"

例如

<form action="${pageContext.request.contextPath}/uploadServlet" method="post" enctype="multipart/form-data">
	用户名:<input type="text" name="username"/><br/>
	请选择文件:<input type="file" name="nfile"/><br/>
	<input type="submit" value="上传"/>
</form>

  

创建表单的步骤

1.创建DiskFileItemFactory 工厂
DiskFileItemFactory dif = new DiskFileItemFactory();
2.创建ServletFileUpload 对象
ServletFileUpload sfu = new ServletFileUpload(dif);
3.判断表单提交 是不是 multipart/form-data
boolean isMultipart = sfu.isMultipartContent(request);

整体代码如下:

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.ServletFileUpload;


@WebServlet(name="UploadServlet" ,urlPatterns="/uploadServlet")
public class UploadServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("------------文件上传----------------");
		//文件上传路径   我的文件上传的是F:\tomcat7\webapps\javaweb项目名下WebRoot中的的新建file文件夹里
		String readPath=this.getServletContext().getRealPath("file");
		//创建DiskFileItemFactory工厂
		DiskFileItemFactory dif=new DiskFileItemFactory();
		ServletFileUpload sfu=new ServletFileUpload(dif);
		boolean iMmultipart = sfu.isMultipartContent(request);
		if(iMmultipart){
			//进行文件上传
			try {
				//解析请求    获取表单元素即表单的全部提交信息
				List<FileItem> items =sfu.parseRequest(request);
				if(items!=null){
					for (FileItem item : items) {
						if(item.isFormField()){          //判断是否是普通字段(即上传的用户名密码等)
							String fileName=item.getFieldName();
							String value=item.getString("UTF-8");
							System.out.println(fileName+"----------"+value);     //读取用户名密码等文件
							
						}else{
							//是要上传的文件
							//获取上传的文件名
							String fileName=item.getName();
							System.out.println("上传的文件名: "+fileName);
						          	//新建一个文件对象 第一个参数放文件上产路径
							File file=new File(readPath,fileName);
							//开始上传
							item.write(file);
							System.out.println("文件上传成功! 文件名是"+fileName);
						}
					}
				}
			} catch (FileUploadException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

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

  

如果再加上
限制文件上传的类型和大小
类型:
List<String> filTypes = Arrays.asList("jpg","png","gif","bmp");

大小:
//设置单个文件的最大限制
upload.setSizeMax(1024*30); 

获取上传文件名的后缀:
String fileType = fileName.substring(fileName.lastIndexOf(".")+1);
System.out.println("后缀:"+fileType);
boolean flag = filTypes.contains(fileType);

完整的代码如下:

package cn.bdqn.demo;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet(name="UploadServlet",value="/uploadServlet")
public class UploadServlet extends HttpServlet {
	
	private static final long serialVersionUID = -2590255173244980573L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("----文件上传---------");
		response.setContentType("text/html; charset=UTF-8");
		response.setCharacterEncoding("UTF-8");
		request.setCharacterEncoding("UTF-8");
		
		//获取上传文件的路径
		String realPath = this.getServletContext().getRealPath("files");
		System.out.println("上传路径:"+realPath);
		//1.创建DiskFileItemFactory
		DiskFileItemFactory dif = new DiskFileItemFactory();
		//2.创建ServletFileUpload 对象
		ServletFileUpload sfu = new ServletFileUpload(dif);
		//3.判断表单提交 是不是 multipart/form-data
		boolean isMultipart = sfu.isMultipartContent(request);
		if(isMultipart){
			//进行文件上传
			//ServletFileUpload 解析请求 获取元素集合
			List<String> filTypes = Arrays.asList("jpg","png","gif","bmp");
			//限定单个文件的大小
			sfu.setSizeMax(1024*30);    //最大30KB
			try {
				List<FileItem> items = sfu.parseRequest(request);
				if(items!=null){
					for(FileItem item : items){
						if(item.isFormField()){   //判断是否是普通字段
							String fieldName = item.getFieldName();
							String value = item.getString("UTF-8");
							System.out.println(fieldName+"---"+value);
						}else{
							//是文件   文件上传
							//获取上传的文件名
							String fileName = item.getName();
							//判断文件类型是否匹配:
							//获取后缀
							String fileType = fileName.substring(fileName.lastIndexOf(".")+1);
							System.out.println("后缀:"+fileType);
							boolean flag = filTypes.contains(fileType);
							if(flag){
								System.out.println("上传的文件名:"+fileName);
								//新建一个文件对象   第一个参数放文件上传路径
								File file = new File(realPath, fileName);
								//开始上传
								item.write(file);
								System.out.println("文件上传成功!");
								response.getWriter().print("文件上传成功!");
							}else{
								response.getWriter().print("上传失败!文件类型必须是jpg,png,gif,bmp!");
							}
						}
					}
				}
			}catch (FileUploadBase.SizeLimitExceededException e) {
				System.out.println("上传失败,文件太大,单个文件的最大限制是:"+sfu.getSizeMax()+"bytes!");
				response.getWriter().print("上传失败,文件太大,单个文件的最大限制是:"+sfu.getSizeMax()+"bytes!");
			}catch (Exception e) {
				e.printStackTrace();
			}
		}else{
			response.getWriter().print("表单不是multipart/form-data,文件上传失败!");
		}
		
	}

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

}