如果上传大文件,那么上传进度的显示就比较重要,那么如何实现进度条的显示呢?
显示文件上传进度,可以使用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 Web开发、多线程、异步处理和前端交互的实例,对于理解和实践Java文件上传功能具有很高的参考价值。通过学习这个示例,开发者可以更好地掌握如何在实际项目中...
总的来说,实现大文件上传并带有进度条的Java应用需要结合文件分块、多线程、异步通信和进度反馈等多个技术点。通过对`UploadBigFile-master`项目代码的分析,你可以更深入地理解这个过程。在实际开发中,还需要注意...
"JSP文件上传 支持进度条显示"这个项目是针对JSP环境设计的一个AJAX Web上传程序,它允许用户上传大文件(如单个文件100M),并具有文件上传进度条的可视化功能。以下将详细解析这个项目的知识点: 1. **JSP(Java...
在Java和jQuery的世界里,实现文件上传带进度条的功能是一项常见的需求,特别是在用户交互体验日益重要的今天。这个功能可以提供给用户一个实时反馈,让他们了解文件上传的状态,从而提升用户体验。接下来,我们将...
Java 文件上传带进度条的功能是通过结合Ajax技术与Struts2框架中的ProgressListener接口来实现的,以便在用户界面实时展示文件上传的进度。以下是详细的知识点解释: 1. **Ajax 进度查询机制**: - 在客户端,使用...
标题中的“Extjs+java+swf多文件上传进度条显示项目”是一个综合性的Web开发实践,涉及到前端的用户界面、后端的数据处理以及文件上传过程中进度反馈的实现。这个项目利用了Extjs库来构建用户界面,Java作为服务器端...
可自主限制上传文件的文件类型 showProgress "" "" "" 方法的第二个参数为限制上传文件类型 多文件时用 ‘|’ 进行分割 如: zip| rar| jif
在本项目中,“Java文件上传带进度条”是通过Java、Servlet和jQuery实现的一个功能,旨在提供更好的用户体验,允许用户在上传文件时看到进度条,从而了解文件传输的状态。 1. **Servlet**: Servlet是Java Web应用...
这个名为“带进度条的文件上传下载组件(JAVA)”的项目,显然聚焦于提供一个用户友好的交互体验,通过显示进度条来增强用户体验,使用户能够清晰地看到文件上传或下载的进度。下面我们将深入探讨这一组件涉及的主要...
本示例“java实现带进度条的文件上传”提供了一个完整的解决方案,结合了HTML、Servlet以及swfupload库,来实现用户友好的文件上传体验,包括实时显示的进度条。 1. **HTML**:HTML是网页的基础,用于构建用户界面...
JAVA文件上传(带进度条),对于java文件上传的使用者绝对不可多得!
**SWFUpload 多文件上传带进度条实例详解** SWFUpload 是一款开源的JavaScript库,专门用于在网页上实现文件的多选上传,并且支持显示上传进度条,为用户提供更好的交互体验。在这个实例中,我们将探讨如何在VS2012...
下面将详细讲解如何使用Java的Swing库创建一个带有进度条的FTP文件上传功能。 首先,我们需要理解FTP的基本原理。FTP是一种用于在Internet上进行文件传输的标准协议。Java提供了一个内置的`java.net.FTPClient`类,...
总的来说,实现Java文件上传进度条涉及的知识点包括:网络编程(HTTP请求)、多线程、文件I/O操作、用户界面更新和异常处理。这是一个综合性的任务,既考验编程基础,又涉及到系统设计和用户体验优化。通过实践这个...
总的来说,Struts2实现文件上传进度条显示需要整合服务器端的进度回调和客户端的进度更新,确保数据的实时同步。同时,为了提高用户体验,应考虑优化大文件上传的性能,如分块上传、断点续传等技术。通过以上步骤,...
"swf+java+servlet多文件上传单个进度条显示"是一个解决方案,它利用了Adobe Flash(SWF)技术、Java后端处理和Servlet来实现多文件上传,并且在上传过程中为所有文件提供一个统一的进度条来展示整体的上传进度。...
本项目提供的"java web 文件上传进度条源码"着重解决了这一需求,包括已用时间、剩余时间、上传速度以及进度条的显示。下面我们将深入探讨相关知识点。 1. **Servlet与HTTP请求**: Java Web应用通常使用Servlet来...
总之,这个项目提供了一个基础的文件上传模板,包括进度显示和取消操作,对于初学者来说,这是一个很好的学习和实践Java文件上传的起点。通过深入研究和扩展,可以将其转化为更复杂、更健壮的文件管理系统。
总的来说,通过Java和Ajax的结合,我们可以构建出一个高效、用户体验良好的文件上传系统,不仅能够异步上传文件,还能实时显示上传进度和速度,大大提升了用户的操作体验。在实际开发中,还需要考虑文件大小限制、...
为了提供良好的用户体验,通常会结合进度条功能,让用户能够实时了解文件上传的状态。在这个场景下,"批量上传文件带进度条"主要涉及的技术点有Java编程语言、多线程、FTP文件传输协议以及用户界面(UI)的设计。 ...