给文件上传添加进度条,整了两天终于成功了。

  想要添加一个上传的进度条,通过分析,应该是需要不断的去访问服务器,询问上传文件的大小。通过已上传文件的大小,

和上传文件的总长度来评估上传的进度。

  实现监听器ProgressListener接口,可以实时获取上传文件的长度。

public class FileUploadListener implements ProgressListener{
private HttpSession session; public FileUploadListener(HttpServletRequest request) {
session = request.getSession();
FileState state = new FileState(); // 自定义FileState POJO类,储存状态信息
session.setAttribute("state", state);
}
@Override
public void update(long readedBytes, long totalBytes, int currentItem) {
// TODO Auto-generated method stub
//System.out.println("update:"+readedBytes+";"+totalBytes+";"+currentItem); FileState state = (FileState) session.getAttribute("state");
state.setReadedBytes(readedBytes); // 已读数据的长度
state.setTotalBytes(totalBytes); // 文件总长度
state.setCurrentItem(currentItem); // 正在保存第几个文件
} }

FileState类

public class FileState {
private long readedBytes = 0L; // 已经上传的字节数,单位:字节
private long totalBytes = 0L; // 所有文件的总长度,单位:字节
private int currentItem = ; // 正在上传第几个文件
private long startTime=System.currentTimeMillis(); //开始上传的时间,用于计算上传的速度 public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public long getReadedBytes() {
return readedBytes;
}
public void setReadedBytes(long readedBytes) {
this.readedBytes = readedBytes;
}
public long getTotalBytes() {
return totalBytes;
}
public void setTotalBytes(long totalBytes) {
this.totalBytes = totalBytes;
}
public int getCurrentItem() {
return currentItem;
}
public void setCurrentItem(int currentItem) {
this.currentItem = currentItem;
} }

把监听器FileUploadListener 添加到MyJakartaMultiPartRequest类中。MyJakartaMultiPartRequest类是Struts2源码中的JakartaMultiPartRequest类。

在此类中添加进度监听器,并覆盖此类。

  private List<FileItem> parseRequest(HttpServletRequest servletRequest, String saveDir) throws FileUploadException {
/* FileState fileState=new FileState();
servletRequest.getSession().setAttribute("state", fileState);*/
DiskFileItemFactory fac = createDiskFileItemFactory(saveDir);
ServletFileUpload upload = new ServletFileUpload(fac);
upload.setSizeMax(maxSize);
// add 设置进度监听器 upload.setProgressListener(new FileUploadListener(servletRequest)); // end
return upload.parseRequest(createRequestContext(servletRequest));
}

在xml中配置

 <!-- 配置自定义文件类myrefactor,继承MultiPartRequest重写 -->
<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="myrefactor"
class="com.service.MyJakartaMultiPartRequest" scope="default" optional="true" />

action

public class FileProgressAction {
/**
* 显示文件上传的进度
*/
public String execute(){
HttpServletResponse response= ServletActionContext.getResponse();
response.setHeader("Cache-Control", "no-store"); //禁止浏览器缓存
response.setHeader("Pragrma", "no-cache"); //禁止浏览器缓存
response.setDateHeader("Expires", ); //禁止浏览器缓存
Map session=ActionContext.getContext().getSession();
PrintWriter out = null;
try {
out = response.getWriter();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FileState status = (FileState)session.get("state");
if(status == null){
//renderText("error");
return null;
} long startTime = status.getStartTime(); //上传开始时间
long currentTime = System.currentTimeMillis(); //现在时间
long time = (currentTime - startTime)/ + ; //已传输的时间 单位:s //传输速度单位:byte/s
double velocity = ((double)status.getReadedBytes()) / (double)time;
//估计总时间
double totalTime = status.getTotalBytes();
//估计剩余时间
double timeLeft = totalTime - time;
//已经完成的百分比
int percent = (int)( * (double)status.getReadedBytes() / (double)status.getTotalBytes());
//已经完成数单位:m
double length = ((double) status.getReadedBytes())//;
//总长度 单位:m
double totalLength = ((double) status.getTotalBytes())//; JSONObject json = new JSONObject();
json.put("percent", percent);
json.put("length", length);
json.put("totalLength", totalLength);
json.put("velocity", velocity);
json.put("time", time);
json.put("totalTime", totalTime);
json.put("timeLeft", timeLeft);
json.put("fileNumber", status.getCurrentItem()); // System.out.println(json.toString());
out.print(json.toString());
return null; }
}

js

 var finished = true; //上传是否结束
function showStatus(){
finished = false;
/*$('#progressBarItem').attr('width','1%');*/ setTimeout('callback()',);
} function callback(){
if(finished) return;
var url = 'fileProgressAction';
$.get(url,function(dataSrc){
var dataS=eval("("+dataSrc+")");
$('#progressBarItem').html("("+dataS.percent+"%"+")");
//alert(dataS.percent);
}); setTimeout('callback()',);
}

jsp

<div style="width: 86px;float: left;margin-top: 15px;margin-left: 5px;">        

     <form action="filesUpload" method="post" enctype="multipart/form-data" style="margin-top: 16px;" onsubmit="return subClick()" >
<a href="javascript:;" class="file">
<img alt="tip" src="data:images/upload.png" style="width: 55px;">
<input type="file" name="myFile" multiple="multiple" id="myFile" value="" onchange="uplaodfileOnChange(this)">
</a> <input type="submit" value="上传文件" style="margin-top: 3px;display: none;" id="sub" class="a-upload" onclick="wait()" /> <div id="fileDiv"></div>
<div style="margin-left: 7px;margin-top: 3px;width: 300px;" id="messageDiv" class="tip">${message} </div>
<%-- <span class="tip" id="perMessage"> ${request.perMessage} </span> --%>
</form>
<div id="error" class="tip" style="width: 1024px;"> <s:fielderror> </s:fielderror></div>
</div>

struts2上传文件添加进度条的更多相关文章

  1. layui上传文件配合进度条

    首先看一下效果图: 修改layui的源文件upload.js 1.打开layui/modules/upload.js 2.搜索ajax 3.找到url: 4.添加以下代码: ,xhr:l.xhr(fu ...

  2. jQuery上传文件显示进度条

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script sr ...

  3. Extjs 使用fileupload插件上传文件 带进度条显示

    一.首先我们看看官方给出的插件的解释: 一个文件上传表单项具有自定义的样式,并且可以控制按钮的文本和 像文本表单的空文本类似的其他特性. 它使用一个隐藏的文件输入元素,并在用户选择文件后 在form提 ...

  4. asp.net mvc 实现上传文件带进度条

    本文乃是博主早期写的,此种思路虽然实现了,但固然不是最好的,仅做参考学习. 可以用js onprogress .fileinput .webuploader.jq ajaxsubmit等实现 思路:a ...

  5. vue项目上传文件以及进度条

    最近做项目的时候,需要上传自定义镜像.并且附带进度条,上网查询一下资料,经过一番折磨,也总算做出来了,把自己写项目的内容给大家分享一下. 先直接贴代码吧 1.首先声明一个formData对象. 2.把 ...

  6. XMLHttpRequest上传文件实现进度条

    话不多说,直接上代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  7. FormData上传文件 带进度条

    * jQuery ajax  FormData 上传文件 template $.ajax({ url: url, type: 'POST', data: new FormData(form), dat ...

  8. ASP.NET Jquery+ajax上传文件(带进度条)

    效果图 支持ie6+,chrome,ie6中文文件名会显示乱码. 上传时候会显示进度条. 需要jquery.uploadify.js插件,稍后会给出下载 前台代码 <%@ Page Langua ...

  9. ajaxSubmit() 上传文件和进度条显示

    1.  首先引用js文件 <script type="text/javascript" src="/js/jquery/jquery.form.js"&g ...

随机推荐

  1. 操蛋的CTex

    我一向是不屑于在windows下用latex的,看起来不伦不类,是geek就不要用windows,图方便就用word而不是latex.但是台式机上的fedora无法上网,那就委屈一下在windows1 ...

  2. 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞

    3578: GTY的人类基因组计划2 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 159[Submit][Status][ ...

  3. MVC重写DefaultModelBinder实现自定义模型绑定

    在编写前台页面的时候为了使url传递参数的简短,比如personId="1"  我们通过url传递成pid=1  那么在后台action方法接受的模型Person类 的属性为per ...

  4. bzoj3262: 陌上花开(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  5. xcoj 1208 矩阵

    赛场上一开始以为是递推,交了一发希望以为能卡着线过(毕竟是O(5N)的),结果WA了. 又以为是dp,最后半小时尝试各种YY...各种WA 实际上取每次transfer中最大的概率然后递推是不对的.. ...

  6. 数据结构算法C语言实现---序言

    期末考试即将到来,打算花两周时间实现书上所有的算法.巩固学习成果(其实之前也没怎么听课......)毕竟考前突击,背背,ppt刷个90+是没多大意义的. 没错,就是下面这本 毕竟书也是借别人的,不抓紧 ...

  7. SQL请求优化——请求次数统计,SQL写操作稀释

    引言 前几天做了这么一个东西:一个游戏中有个活动页面,活动页面有个商品,商品下面要显示该商品实浏览次数,就相当于是用户每出发一次请求这个浏览总次数都会添加一次,这个问题很简单,每次浏览的时候去数据库中 ...

  8. 解决 Ubuntu 无法调节屏幕亮度的问题(转)

    转http://blog.163.com/tym190@126/blog/static/8776005920143192412477/ 终端输入代码:     在打开文件中找到 GRUB_CMDLIN ...

  9. 分布式服务框架Zookeeper

    协议介绍 zookeeper协议分为两种模式 崩溃恢复模式和消息广播模式 崩溃恢复协议是在集群中所选举的leader 宕机或者关闭 等现象出现 follower重新进行选举出新的leader 同时集群 ...

  10. 同样有缓冲区,为什么bufferedReader输入流不需要清空缓冲区?而bufferedWriter需要清空缓冲区呢?

    当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取, 如果缓冲区数据不足,才会再从文件中读取.清不清空Buf ...