(五)Servlet上传文件(2)--使用开源Apache commons fileupload包

首先须要注意的问题:html

1 . form表单的内容格式要定义成multipart/form-data格式.
2 . 须要导入类库:java

commons-fileupload-x.x.x.jar (下载地址:http://commons.apache.org/proper/commons-fileupload/)apache

commons-io-x.x.jar (下载地址:http://commons.apache.org/proper/commons-io/)post

使用开源Apache commons fileupload包上传文件大概步骤以下:编码

1 . 建立文件解析对象spa

DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(factory);
sfu.setHeaderEncoding("utf-8"); //设置编码
sfu.setFileSizeMax(1024*1024*1); //设置单个上传文件最大字节数
sfu.setSizeMax(1024*1024*10); //设置整个表单最大字节数

2 . 建立一个集合保存表单数据.net

List<FileItem> formList = sfu.parseRequest(request);

3 . 读取表单内容code

for (FileItem fileItem: formList) {
	//表单控件name属性值
	String fieldName = fileItem.getFieldName();
	System.out.println("========控件名称 : " + fieldName + "========");
	if (fileItem.isFormField()) { //检测表单类型    true:普通表单  false:表单包含文件数据
		String fieldValue = fileItem.getString();
		fieldValue = new String(fieldValue.getBytes("ISO-8859-1"), "UTF-8");
		System.out.println("普通内容:" + fieldName + "=" + fieldValue);
	} else {
		String fileName = fileItem.getName();
		long fileSize = fileItem.getSize();
		File uploadFile = new File(saveDir, fileName);
		fileItem.write(uploadFile);//保存上传文件
		System.out.println("文件名 : " + fileName);
		System.out.println("文件大小 : " + fileSize + "byte");
		System.out.println("文件保存路径 : " + savePath);
	}
}

具体事例以下:orm

1 . 源代码htm

FileUpload.html

<!DOCTYPE html>
<head>
	<title>testUpload</title>
	<meta charset="utf-8">
</head>
<body>
    <h3>文件上传</h3>
    <form enctype="multipart/form-data" method="post" action="FileUpload">
	        文件描述:<input type="text" name="text" /><br/>
	        选择文件:<input type="file" name="file1" /><br/>
		<input type="submit" value="上传" />
    </form>   
</body>

FileUpload.java

package cn.iborder.upload;
import java.io.File;
import java.io.IOException;
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.ServletFileUpload;
/**
 * Servlet implementation class FileUpload
 */
public class FileUpload extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FileUpload() {
        super();
        // TODO Auto-generated constructor stub
    }
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setCharacterEncoding("UTF-8");
        response.getWriter().println("请以POST方式上传文件");
	}
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//保存路径
		String savePath = getServletContext().getRealPath("/temp1");
		File saveDir = new File(savePath);
		if (!saveDir.exists()) {
			saveDir.mkdir();
		}
		
		//建立核心上传类实例
		DiskFileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload sfu = new ServletFileUpload(factory);
		sfu.setHeaderEncoding("utf-8");		//设置编码
		sfu.setFileSizeMax(1024*1024*1);	//设置单个上传文件最大字节数
		sfu.setSizeMax(1024*1024*10);		//设置整个表单最大字节数
		
		//读取表单数据
		try {
			List<FileItem> formList = sfu.parseRequest(request);
			for (FileItem fileItem : formList) {
				//表单控件name属性值
				String fieldName = fileItem.getFieldName();
				System.out.println("========控件名称 : "+fieldName+"========");
				if(fileItem.isFormField()){	//检测表单类型    true:普通表单  false:表单包含文件数据
					String fieldValue = fileItem.getString();
					fieldValue = new String(fieldValue.getBytes("ISO-8859-1"), "UTF-8");
					System.out.println("普通内容:" + fieldName + "=" + fieldValue);
				}else{
					String fileName = fileItem.getName();
					long fileSize = fileItem.getSize();
					File uploadFile = new File(saveDir, fileName);
					fileItem.write(uploadFile); //保存上传文件
					System.out.println("文件名 : "+fileName);
					System.out.println("文件大小 : "+fileSize+"byte");
					System.out.println("文件保存路径 : "+savePath);
				}
			}
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			System.out.println("获取表单内容失败!");
			System.out.println(e.getMessage());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("保存上传文件失败!");
			System.out.println(e.getMessage());
		}
	}
}

2 . 运行结果

 

 相关类说明:

1 . DiskFileItemFactory类

将请求消息实体中的每个项目封装成单独的DiskFileItem (FileItem接口的实现) 对象的任务
由 org.apache.commons.fileupload.FileItemFactory 接口的默认实现 
org.apache.commons.fileupload.disk.DiskFileItemFactory 来完成。当上传的文件项目比较小时,直接保存在内存中(速度比较快),比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,可是内存资源是有限的)。

构造方法
1) public DiskFileItemFactory()

      采用默认临界值和系统临时文件夹构造文件项工厂对象。

2) public DiskFileItemFactory(int sizeThreshold,File repository)

      采用参数指定临界值和系统临时文件夹构造文件项工厂对象。

2 . ServletFileUpload 类

org.apache.commons.fileupload.servlet.ServletFileUpload类是Apache文件上传组件处理文件上传的核心高级类(所谓高级就是不须要管底层实现,暴露给用户的简单易用的接口)。

使用其parseRequest(HttpServletRequest) 方法能够将经过表单中每个HTML标签提交的数据封装成一个FileItem对象,而后以List列表的形式返回。使用该方法处理上传文件简单易用。

若是你但愿进一步提升新能,你能够采用 getItemIterator 方法,直接得到每个文件项的数据输入流,对数据作直接处理。

在使用ServletFileUpload对象解析请求时须要根据DiskFileItemFactory对象的属性sizeThreshold(临界值)和repository(临时目录)来决定将解析获得的数据保存在内存仍是临时文件中,若是是临时文件,保存在哪一个临时目录中?。因此,咱们须要在进行解析工做前构造好DiskFileItemFactory对象,经过ServletFileUpload对象的构造方法或setFileItemFactory()方法设置ServletFileUpload对象的fileItemFactory属性。

3 . FileItem类

文件上传时须要用到FileItem类,FileItem是一个接口,它的实现类是DiskFileItem。经常使用方法以下:

1)boolean  isFormField()。isFormField方法用来判断FileItem对象里面封装的数据是一个普通文本表单字段,仍是一个文件表单字段。若是是普通文本表单字段,返回一个true不然返回一个false。所以能够用该方法判断是不是普通表单域仍是文件上传表单域。

2)String getName()。getName方法用来得到文件上传字段中的文件名。

3)String getFieldName()。getFieldName方法用来返回表单标签的name属性的值。

4)void write(File file)。write方法将FileItem对象中的内容保存到某个指定的文件中。若是FileItem对象中的内容是保存在某个临时文件中,该方法完成后,临时文件能够会被删除。该方法也能够将普通表单字段保存在一个文件中,但最主要的用途是把上传的文件内容保存在本地文件系统中。

5)String getString()。getString()方法将FileItem对象中保存的数据流内容以一个字符串返回。它有两个重载形式。public java.lang.String getString()和public java.lang.String getString(java.lang.String encodeing) throws java.io.UnsupportedEncodingException。前者使用缺省的字符集编码将主体内容转换成字符串,后者使用参数指定的字符集编码。若是在读取普通表单字段元素的内容时,出现了乱码现象,能够调用第二个方法,并传入 正确的字符集编码名称。

6)String getContentType()。此方法用来得到上传文件的类型,即标段字段元素描述头属性“content-type”的值,如image/jpeg。若是FileItem对象对应的是普通的表单字段,将返回null。

7)boolean isInMemory()。判断FileItem对象封装的数据是保存在内存中仍是硬盘中。

8)void  delete()。此方法用来清空FileItem对象中封装的主体内容,若是内容是被保存在临时文件中,该方法会把临时文件删除。

9)InputStream  getInputStream()。以流的形式返回上传文件的主体内容。

10)long  getSize()。返回上传文件的大小。

相关文章
相关标签/搜索