如果上传大文件,那么上传进度的显示就比较重要,那么如何实现进度条的显示呢?
显示文件上传进度,可以使用apache下的FileUpload 组件,它的下载地址是:
http://commons.apache.org/fileupload/
它的User Guide里http://commons.apache.org/fileupload/using.html有详细的使用的例子和说明。
我的实现思路如下:
// 准备上传
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(2048);
String tempPath = AppConstants.ROOTPATH + "upload/tmp/";
File fp1 = new File(tempPath);
if(!fp1.exists())
fp1.mkdirs();
File tempFile = new File(tempPath);
factory.setRepository(new File(tempPath));
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(1024000000);
ProgressListener progressListener = new UploadProgress();
request.getSession().setAttribute("progress", progressListener);
upload.setProgressListener(progressListener);
List items = upload.parseRequest(request);
String comment = ""; //存储评论
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
if(name.equals("pid"))
{
pid = value;
}
else
comment = value;
} else {
String fileName = item.getName();
if(fileName == null || fileName.equals(""))
continue;
fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
String ext = fileName.substring(fileName.lastIndexOf("."));
ext = ext.toLowerCase();
long curTime = System.currentTimeMillis();
Random random = new Random(100000000);
String filename = String.valueOf(curTime) + "_"
+ random.nextInt(100000000) + ext;
String filePath = AppConstants.ROOTPATH + "/uploadfile/"+loguser.getId()+"/files/"+pid+"/";
String path = "/uploadfile/"+loguser.getId()+"/files/"+pid+"/";
File fp = new File(filePath);
if(!fp.exists())
fp.mkdirs();
File uploadedFile = new File(fp, filename);
item.write(uploadedFile);
如上源代码,upload.setSizeMax(1024000000); 可以设置文件上传最大支持的大小, factory.setRepository(new File(tempPath));设置这个可以是上传大文件的时候,不是把上传的所有数据一直存入内存,而是当达到factory.setSizeThreshold(2048);所设置的文件大小后,就存入临时文件,利用这个特性可以使上传大文件的时候不会占用大量内存,可以提供用户的并发使用量。
upload.setProgressListener(progressListener); 这是设置的一个监听器,就是通过它来获取已经上传的文件的大小。
我的progressListner定义如下:
public class UploadProgress implements ProgressListener {
private double upRate = 0.0;
private double percent = 0.0;
private long useTime = 0;
private long upSize = 0;
private long allSize = 0;
private int item;
private long beginT = System.currentTimeMillis();
private long curT = System.currentTimeMillis();
public void update(long pBytesRead, long pContentLength, int pItems) {
curT = System.currentTimeMillis();
item = pItems;
allSize = pContentLength; //byte
upSize = pBytesRead; //byte
useTime = curT-beginT; //ms
if(useTime != 0)
upRate = pBytesRead/useTime; // byte/ms
else
upRate = 0.0;
if(pContentLength == 0)
return;
percent = (double)pBytesRead/(double)pContentLength; //百分比
}
public long getAllSize() {
return allSize;
}
public void setAllSize(long allSize) {
this.allSize = allSize;
}
public long getBeginT() {
return beginT;
}
public void setBeginT(long beginT) {
this.beginT = beginT;
}
public long getCurT() {
return curT;
}
public void setCurT(long curT) {
this.curT = curT;
}
public int getItem() {
return item;
}
public void setItem(int item) {
this.item = item;
}
public double getPercent() {
return percent;
}
public void setPercent(double percent) {
this.percent = percent;
}
public double getUpRate() {
return upRate;
}
public void setUpRate(double upRate) {
this.upRate = upRate;
}
public long getUpSize() {
return upSize;
}
public void setUpSize(long upSize) {
this.upSize = upSize;
}
public long getUseTime() {
return useTime;
}
public void setUseTime(long useTime) {
this.useTime = useTime;
}
}
这个监听类要继承ProgressListener 并实现update函数。
而如何实现进度的显示呢,可以通过在页面上用javascript写一个定时器,setInterval("showRequest();",1000);通过这个定时器,不断去请求后台,获取进度,进行显示,而获取进度处理函数如何获取文件上传的进度呢,可以通过request.getSession().setAttribute("progress", progressListener); 把监听类存入session,然后在获取进度的action中获取上传的进度。
相关推荐
java实现大文件上传并有进度条及其代码解析
java 文件上传带进度条,代码例子详细写在里面
Java的上传代码 带有进度条的上传 亲测无误 运行环境:tomcat7 JKD1 7
JAVA -jquery--fileupload 文件上传带进度条 已测可用.
可自主限制上传文件的文件类型 showProgress "" "" "" 方法的第二个参数为限制上传文件类型 多文件时用 ‘|’ 进行分割 如: zip| rar| jif
Extjs+java+swf多文件上传进度条显示项目 采用了swf插件 后端使用java servlet 项目简单使用 页面美观,希望能多交流
JAVA文件上传(带进度条),对于java文件上传的使用者绝对不可多得!
java FTP上传文件(进度条显示进度)
上传组件 含进度条java上传组件含进度条java上传组件含进度条java上传组件含进度条java上传组件含进度条java上传组件含进度条
swfupload多文件上传带进度条实例,vs2012开发,net4.0框架,可上传多个文件,上传类型、上传大小、上传数量可控,已测试成功!
java文件上传进度条实现,可以参考下,会有意外收获
struts2上传文件进度条显示,里面有详细的代码
java struts2实现文件上传进度条显示
swf+java+servlet多文件上传单个进度条显示,简单实用,缺点项目中上传多个文件使用一个进度条显示传输进度
java大文件上传至ftp服务器带进度条显示的,进度条的显示和ftp的上传速度同步,解决了进度条显示和ftp不同步的问题
批量上传文件带进度条批量上传文件带进度条批量上传文件带进度条批量上传文件带进度条
extjs的java版本的上传文件进度条
封装了的文件上传下载,下载后按说明操作就OK
java做的一个带进度条的文件上传,还有取消按钮,用的是commons-fileupload,直接下载就能运行,该有的包都有
java oss图片单个上传、多个上传、分片上传、进度条完整代码