博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struts2上传文件添加进度条
阅读量:4623 次
发布时间:2019-06-09

本文共 5967 字,大约阅读时间需要 19 分钟。

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

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

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

  实现监听器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 = 0; // 正在上传第几个文件    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
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中配置

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", 0); //禁止浏览器缓存              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)/ 1000 + 1; //已传输的时间 单位:s                          //传输速度单位:byte/s             double velocity = ((double)status.getReadedBytes()) / (double)time;             //估计总时间             double totalTime = status.getTotalBytes();             //估计剩余时间             double timeLeft = totalTime - time;             //已经完成的百分比             int percent = (int)(100 * (double)status.getReadedBytes() / (double)status.getTotalBytes());             //已经完成数单位:m             double length = ((double) status.getReadedBytes())/1024/1024;             //总长度 单位:m             double totalLength = ((double) status.getTotalBytes())/1024/1024;                           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()',100);             }                            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()',100);              }

jsp

tip
${message}
<%--
${request.perMessage} --%>

 

转载于:https://www.cnblogs.com/heyesp/p/4577245.html

你可能感兴趣的文章
搭建git服务器
查看>>
iOS之UIDynamic UI动力学使用步骤
查看>>
poj 2498 动态规划
查看>>
Windows Phone 7中使用PhoneApplicationService类保存应用程序状态
查看>>
MySql数据库的下载和安装卸载
查看>>
JDBC接口核心的API
查看>>
双缓冲技术局部更新原理之派生自View
查看>>
PPAPI插件与浏览器的通信
查看>>
用 query 方法 获得xml 节点的值
查看>>
Hello,Android
查看>>
Sublime Text 3 build 3103 注册码
查看>>
删与改
查看>>
SAP 中如何寻找增强
查看>>
spi驱动无法建立spidev问题
查看>>
ANDROID开发之SQLite详解
查看>>
如何依靠代码提高网络性能
查看>>
Zookeeper要安装在奇数个节点,但是为什么?
查看>>
discuz 微社区安装记录
查看>>
[BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数
查看>>
配置的热更新
查看>>