Commons_FileUpload

来源:互联网 发布:sai for mac 10.12 编辑:程序博客网 时间:2024/05/22 17:10
从V1.1版开始,FileUpload就开始支持servlet和porlet的文件上传请求,我们将在servlet环境里实现文件上传。
为了确保是一个文件上传请求,FileUpload是通过调用一个静态的方法来判断:
boolean isMultipart=ServletFileUpload.isMultipartContent(request);


上传项目只要足够小,就应该保留在内存里。
较大的项目应该被写在硬盘的临时文件上。
限制项目在内存中所占的控件,限制最大的上传请求,并设置临时文件的位置。
处理上面的情况很简单:
//创建一个工厂函数:
DiskFileItemFactory factory=new DiskFileItemFactory();
//设置工厂函数常量
factory.setSizeThreshold(yourMaxMemotySize);//上传所用的最大内存大小
factory1.setRepository(yourTempDirectory);//设置临时文件保存路径


//创建一个文件上传处理
ServletFileUpload upload = new ServletFileUpload(factory);
//设置最大上传文件
upload.setSizeMax(1024*1024*20);


//转换request
List /* FileItem */ items = upload.parseRequest(request);


上面的语句执行完,你会得到一个待处理的文件项目列表。你可以这样来处理文件上传域和正常的表单域:
Iterator iter=items.iterator();
while(iter.hasNext()){
FileItem item=(FileItem)iter.next();
//对于普通的表单域
if(item.isFormField()){
String name=item.getFieldName();//获得普通表单域的名称
String value=item.getString();//获得普通表单域的值
....
}


//对于文件上传域
if(!item.isFormField()){
String fieldName=item.getFieldName();//获得文件域的名称
String fileName=item.getName();//获得文件名
String contentType=item.getContentType();//获得文件类型
long sizeInBytes=item.getSize();//获得上传文件的大小


//以当前时间来生成上传文件的文件名
FileOutputStream fos=new FileOutputStream(request.getRealpath("/")+System.currentTimeMillis()+fileName.subString(fileName.lastIndexOf("."),fileName.length()));
FileOutputStream fos=new FileOutputStream(request.getRealPath("/")+System.currentTimeMillis()+fileName.subString(fileName.lastIndexOf("."),fileName.length()));


//如果上传文件域对应文件的内容已经在内容中
if(item.isInMemory()){
//用get()方法来获得数据的二进制数据形式
fos.write(item.get());
}
//如果文件内容不完全在内存中
else{
//获取上传文件内容的输入流
InputStream is=item.getInputStream();
byte[] buffer=new byte[1024];
int len;
//读取上传文件的内容,并将其写入服务器的文件中
while((len=is.read(buffer))>0){
fos.write(buffer,0,len);
}
is.close();
fos.close();
}


....
}
}


监听进度:
ProgressListener progessListener=new ProgressListener(){
private long megaBytes=-1;
public void update(long pBytesRead,long pContentLength,int pItems){
long mBytes=pBytesRead/1000000;
if(megaBytes==mBytes){
return;
}
megaBytes=mBytes;
System.out.println("We area currently reading item"+pItems);
if(pContentLength==-1){

System.out.println("So far,"+ pBytesRead+"bytes have been read.");
}else{
System.out.println("So far,"+pBytesRead+"of "+ pContentLength+ "bytes have been read.");
}
}
};















































































































0 0