DiskFileItemFactory API详解

 

	核心API介绍
		1.DiskFileItemFactory
			作用:可以设置缓存大小以及临时文件保存位置.			
			默认缓存大小是  10240(10k).
			临时文件默认存储在系统的临时文件目录下.(可以在环境变量中查看)
			
			1.new DiskFileItemFactory();
				缓存大小与临时文件存储位置使用默认的.
				
			2.DiskFileItemFactory(int sizeThreshold, File repository) 
				sizeThreshold :缓存大小
				repository:临时文件存储位置
				
			注意,对于无参数构造,也可以设置缓存大小以及临时文件存储位置.	
			 setSizeThreshold(int sizeThreshold)
			 setRepository(File repository)
			
		2.ServletFileUpload
			1.ServletFileUpload upload=new ServletFileUpload(factory);
			 创建一个上传工具,指定使用缓存区与临时文件存储位置.
			
			2.List<FileItem> items=upload.parseRequest(request);
				它是用于解析request对象,得到所有上传项.每一个FileItem就相当于一个上传项.
				
			3.boolean flag=upload.isMultipartContent(request);
				用于判断是否是上传.
				可以简单理解,就是判断encType="multipart/form-data";
				
			4.设置上传文件大小
				void setFileSizeMax(long fileSizeMax) 设置单个文件上传大小 
				void  setSizeMax(long sizeMax) 设置总文件上传大小 

			5.解决上传文件中文名称乱码
				setHeaderEncoding("utf-8");
				注意:如果使用reqeust.setCharacterEncoding("utf-8")也可以,但不建议使用。
实现步骤
1、创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录
2、使用DiskFileItemFactory 对象创建ServletFileUpload对象,并设置上传文件的大小限制。
3、调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对
象。
4、对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件
True 为普通表单字段,则调用getFieldName、getString方法得到字段名和字段值
False 为上传文件,则调用getInputStream方法得到数据输入流,从而读取上传数据。

编码实现文件上传

DiskFileItemFactory 是创建 FileItem 对象的工厂,这个工厂类常用方法:
public DiskFileItemFactory(int sizeThreshold, java.io.File repository) 
构造函数

public void setSizeThreshold(int sizeThreshold) 
设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时, fileupload组件将使用临时文件缓
存
上传文件。

public void setRepository(java.io.File repository) 
指定临时文件目录,默认值为System.getProperty("java.io.tmpdir").

ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常
用方法有:
boolean isMultipartContent(HttpServletRequest request) 
判断上传表单是否为multipart/form-data类型
List parseRequest(HttpServletRequest request)
解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。 
setFileSizeMax(long fileSizeMax)
设置单个上传文件的最大值
setSizeMax(long sizeMax) 
设置上传文件总量的最大值
setHeaderEncoding(java.lang.String encoding)
设置编码格式,解决上传文件名乱码问题
setProgressListener(ProgressListener pListener)
实时监听文件上传状态

FileItem 用来表示文件上传表单中的一个上传文件对象或者普通表单对象
boolean  isFormField() 判断FileItem是一个文件上传对象还是普通表单对象
如果判断是一个普通表单对象
String   getFieldName()  获得普通表单对象的name属性
String  getString(String encoding) 获得普通表单对象的value属性,可以用encoding进行编码设置

如果判断是一个文件上传对象
String  getName() 获得上传文件的文件名(有些浏览器会携带客户端路径)
InputStream getInputStream()  获得上传文件的输入流
delete()  在关闭FileItem输入流后,删除临时文件



FileUpload上传操作核心API

1、DiskFileItemFactory 磁盘文件项工厂类

public DiskFileItemFactory(int sizeThreshold, java.io.File repository)  构造工厂时,指定内存缓冲区大小和临时文件存放位置

 

public void setSizeThreshold(int sizeThreshold) 设置内存缓冲区大小,默认10K

 

public void setRepository(java.io.File repository)设置临时文件存放位置,默认System.getProperty("java.io.tmpdir").

 

内存缓冲区: 上传文件时,上传文件的内容优先保存在内存缓冲区中,当上传文件大小超过缓冲区大小,就会在服务器端产生临时文件

临时文件存放位置: 保存超过了内存缓冲区大小上传文件而产生临时文件

* 产生临时文件可以通过 FileItem的delete方法删除

 

2、ServletFileUpload 文件上传核心类

static boolean  isMultipartContent(javax.servlet.http.HttpServletRequest request)  判断request的编码方式是否为multipart/form-data

 

java.util.List   parseRequest(javax.servlet.http.HttpServletRequest request) 解析request,将请求体每个部分封装FileItem对象,返回List<FileItem>

 

void setFileSizeMax(long fileSizeMax) 设置单个文件上传大小

 void  setSizeMax(long sizeMax) 设置总文件上传大小

 

void setHeaderEncoding(java.lang.String encoding)  设置编码集 解决上传文件名乱码 *****

 

 

3、FileItem 表示文件上传表单中 每个数据部分

boolean isFormField()  判断该数据项是否为文件上传项,true 不是文件上传 false 是文件上传

if(fileItem.isFormField()){

   // 不是上传项

   java.lang.String getFieldName()  获得普通表单项name属性

   java.lang.String getString() / java.lang.String getString(java.lang.String encoding) 获得普通表单项value属性 传入编码集用来解决输入value乱码

}else{

   // 是上传项

   java.lang.String getName() 获得上传文件名 (注意IE6存在路径)

   java.io.InputStream getInputStream() 获得上传文件内容输入流

   // 上传文件

   void delete()  删除临时文件(删除时,必须要管理输入输出流)

}

 

注意事项:因为文件上传表单采用编码方式multipart/form-data 与传统url编码不同,所有getParameter 方法不能使用 setCharacterEncoding 无法解决输入项乱码问题

 

package cn.learn.web.servlet;

import java.io.File;
import java.io.FileOutputStream;
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;
import org.apache.commons.io.IOUtils;

//commons-fileupload api详解
@SuppressWarnings("all")
public class Upload3Servlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");

		// 1.创建 DiskFileItemFactory
		// DiskFileItemFactory factory = new DiskFileItemFactory(); //使用默认的.
		File file = new File(this.getServletContext().getRealPath("/temp"));// 获取temp目录部署到tomcat后的绝对磁盘路径
		DiskFileItemFactory factory = new DiskFileItemFactory(1024 * 100, file); // 使用默认的.

		// 2.创建ServletFileUpload
		ServletFileUpload upload = new ServletFileUpload(factory);
		boolean flag = upload.isMultipartContent(request); // 用于判断是否是上传操作.
		if (flag) {
			// 解决上传文件名称中文乱码
			upload.setHeaderEncoding("utf-8");

			// 设置上传文件大小
			//upload.setSizeMax(1024 * 1024 * 10);// 总大小为10m

			try {
				List<FileItem> items = upload.parseRequest(request);// 解决request,得到所有的上传项FileItem

				// 3.得到所有上传项
				for (FileItem item : items) {
					if (item.isFormField()) {
						// 非上传组件
						System.out.println("组件名称:" + item.getFieldName());
						System.out.println("内容:" + item.getString("utf-8")); // 解决乱码问题
					} else {
						// 上传组件
						System.out.println("组件名称:" + item.getFieldName());
						System.out.println("上传文件名称:" + item.getName());

						String name = item.getName(); // 上传文件名称
						System.out.println(name);
						name = name.substring(name.lastIndexOf("\\") + 1);

						IOUtils.copy(item.getInputStream(),
								new FileOutputStream("d:/upload/" + name));

						// 删除临时文件
						item.delete();
					}
				}

			} catch (FileUploadException e) {
				// e.printStackTrace();
				response.getWriter().write(e.getMessage());
				return;
			}
		} else {
			response.getWriter().write("不是上传操作");
			return;
		}
	}

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

}

 

  • 18
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值