strtus2实现上传进度条的总结

1 创建监听的实体类
public class FileUploadStatus {

private long bytesRead;//已上传大小(b)
private long contentLength;//总大小
private int items; //正在上传的第几个文件
private boolean flag;//是否上传完成
private long startTime = System.currentTimeMillis(); // 开始上传的时间,用于计算上传速度等
private int percent; // 上传百分比 
private double velocity; //上传的速率

public double getVelocity() {
	return velocity;
}
public void setVelocity(double velocity) {
	this.velocity = velocity;
}
public long getBytesRead() {
	return bytesRead;
}
public void setBytesRead(long bytesRead) {
	this.bytesRead = bytesRead;
}
public long getContentLength() {
	return contentLength;
}
public void setContentLength(long contentLength) {
	this.contentLength = contentLength;
}
public int getItems() {
	return items;
}
public void setItems(int items) {
	this.items = items;
}
public boolean isFlag() {
	return flag;
}
public void setFlag(boolean flag) {
	this.flag = flag;
}
public long getStartTime() {
	return startTime;
}
public void setStartTime(long startTime) {
	this.startTime = startTime;
}
public int getPercent() {
	return percent;
}
public void setPercent(int percent) {
	this.percent = percent;
} 

}
2 创建监听类
public class MyProgressListener implements ProgressListener {

 private HttpSession session;
 private FileUploadStatus status;
 
 public MyProgressListener(HttpServletRequest req) {
     this.session = req.getSession();
     status = new FileUploadStatus();
     status.setFlag(false);
     session.setAttribute("uploadStatus",status);
}

@Override
public void update(long pBytesRead, long pContentLength, int pItems) {
	
	Object attribute = session.getAttribute("uploadStatus");
	if(null == attribute){
		status.setFlag(false);
		session.setAttribute("uploadStatus",status);
	}else{
		status = (FileUploadStatus)attribute;
	}
    status.setBytesRead(pBytesRead);
    status.setContentLength(pContentLength);
    status.setItems(pItems);
    //上传开始时间
    long startTime = status.getStartTime();
    long currentTime = System.currentTimeMillis(); //现在时间
    long time = (currentTime - startTime)/ 1000; //已传输的时间 单位:s
    if ((Long.valueOf(pBytesRead) * 100 / Long.valueOf(pContentLength) <= 100)) {  
        // 生成当前上传进度的公式,加入判断条件的含义在于不需要重复计算  
       int percent = (int) (Long.valueOf(pBytesRead) * 100 / Long.valueOf(pContentLength));  
       status.setPercent(percent);
    } 
    //传输速度单位:byte/s
    double velocity = ((double)status.getBytesRead()/1000) / (double)time;
    status.setVelocity(velocity);
    //估计总时间
    double totalTime = status.getContentLength()/velocity;
    //估计剩余时间
    double timeLeft = totalTime - time;
    
    if(pBytesRead == pContentLength){
    	status.setFlag(true);
    }else{
    	status.setFlag(false);
    }
    session.setAttribute("uploadStatus", status);
}

}
3 自己重新实现strtus2的MultiPartRequest接口。因为strtus2框架的实现类没有注入监听器,所以需要自己手动实现。(具体为啥要实现,网上有比较多的理论,请自行搜索查看),只需要重新实现一个方法即可。
private List parseRequest(HttpServletRequest servletRequest, String saveDir) throws FileUploadException {
DiskFileItemFactory fac = createDiskFileItemFactory(saveDir);
ServletFileUpload upload = new ServletFileUpload(fac);
FileUploadStatus status = new FileUploadStatus();
servletRequest.getSession().setAttribute(“uploadStatus”, status);
// 设置上传进度的监听
upload.setProgressListener(new MyProgressListener(servletRequest));
upload.setSizeMax(maxSize);
return upload.parseRequest(createRequestContext(servletRequest));
}
剩下的方法和org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest 一样(copy即可)。
4 修改strtus2的配置文件strtus.xml,添加

<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="myRequestParser" class="com.run.wzgl.interceptor.MyRequestParser" scope="default" optional="true"></bean> 
<constant name="struts.multipart.parser" value="myRequestParser" />

5 实现获取上传进度的类
public void uploadProgress() throws Exception {

	System.out.println("获取上传文件进度信息");
	JSONObject json = new JSONObject();
	Object attribute = ServletActionContext.getRequest().getSession().getAttribute("uploadStatus");
	FileUploadStatus status = null;
	if(null == attribute){
		System.out.println("session中没有fileupload信息1");
		json.put("progress", status);
		this.outPrintJson(json);
    }else{
        System.out.println("session中有fileupload信息2"+status.toString());
        status = (FileUploadStatus)attribute;
    }
	
	json.put("progress", status);
	this.outPrintJson(json);
}

6 前端实现。每隔100毫秒请求上传进度的实现类(具体实现要看前端的设计)
//循环查看状态
var t = setInterval(function(){
$.ajax({
url: ‘uploadProgress.do’,
type: ‘GET’,
dataType: ‘json’,
async:false,
cache:false,
success: function (data) {
var byteRead = data.progress.bytesRead;
var contentLength = data.progress.contentLength;
var percent = data.progress.percent;
if(byteRead==contentLength){
clearInterval(t);
}
alert(“已上传文件”+percent+"%");
},
error: function(){
console.log(“error”);
}
});
}, 100);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电子图书资源服务系统是一款基于 Java Swing 的 C-S 应用,旨在提供电子图书资源一站式服务,可从系统提供的图书资源中直接检索资源并进行下载。.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人系统开发经验充足,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(若有),项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注计算机领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能 【无积分此资源可联系获取】 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。积分/付费仅作为资源整理辛苦费用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值