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.");
}
}
};
为了确保是一个文件上传请求,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
- Commons_FileUpload
- commons_fileupload凌晨学习笔记
- struts2文件上传commons_fileUpload
- commons_fileupload组件 简单文件上传
- 文件上传-通过commons_FIleUpload实现
- spring对commons_fileupload和cos_fileuplaod的封装
- 9web xml元素
- Android动画原理分析
- webservice学习之处理Map等CXF无法自动转化的类型
- 提高项目31.1-统计代码中的if、while、 for字符串
- c++中字符串分割函数
- Commons_FileUpload
- webview
- Ubuntu 修改用户名和密码之后,进入不了图形界面
- Android之监听手机软键盘弹起与关闭
- 怎么区分静态网页和动态网页
- oracle 基础四 闪回
- 静态成员变量和非静态成员变量的对比
- numpy module 3 -- 科学计算1
- TestNG入门笔记[5]:TestNG + ANT