需要的包
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 为普通表单字段,则调用getFieldName、getString方法得到字段名和字段值
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