文件上传案例

需要的包
commons-fileupload-1.2.1.jar
commons-io-1.4.jar

实现步骤

1、创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录

2、使用DiskFileItemFactory对象创建ServletFileUpload对象,并设置上传文件的大小限制。

3、调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。

4、对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件

True 为普通表单字段,则调用getFieldNamegetString方法得到字段名和字段值

   False为上传文件,则调用getInputStream方法得到数据输入流,从而读取上传数据。


案例代码

			//1.创建工厂
			DiskFileItemFactory factory = new DiskFileItemFactory();
			//2.通过工厂生产上传核心类
			ServletFileUpload sfu = new ServletFileUpload(factory);
			//3.利用核心类解析request
			List<FileItem> list = sfu.parseRequest(request);
			//4.遍历所有FileItem
			for(FileItem item : list){
				if(item.isFormField()){
					//file.isFormField()返回真,是一个字段
					String name = item.getFieldName();
					String value = item.getString();
					System.out.println(name+"--"+value);
				}else{//file.isFormField()返回假,是一个文件
					//获得文件名
					String name = item.getName();
					File file = new File(name);
					//产生随机名
					name=UUID.randomUUID()+ file.getName();
					//创建文件存储路径
					String path = this.getServletContext().getRealPath("/WEB-INF/upload");
					//获得文件的hash值
					int hash = name.hashCode();
					//转成16进制的字符
					String hashStr = Integer.toHexString(hash);
					//每个字符看作一级目录,拼成完整路径
					char[] hss = hashStr.toCharArray();
					for(char c : hss){
						path+="/"+c;
					}
					//创建目录
					new File(path).mkdirs();
					InputStream in = item.getInputStream();
					OutputStream out = new FileOutputStream(new File(path,name));
					IOutils.In2Out(in, out);
					IOutils.Close(in, out);
					
				}
			}

上述代码中用到的辅助类

辅助类IOutils.java


package tm.change.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class IOutils {
	public static void In2Out(InputStream in,OutputStream out) throws IOException{
		byte bs[] = new byte[1024];
		int i =0;
		while((i=in.read(bs))!=-1){
			out.write(bs,0,i);
		}
	}
	public static void Close(InputStream in, OutputStream out){
		if(in != null){
			try {
				in.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				in = null;
			}
		}
		if(out != null){
			try {
				out.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				out = null;
			}
		}
	}
}


视频讲解:大型实训3.25

http://pan.baidu.com/s/1mibeQ4g








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值