当前位置: 移动技术网 > IT编程>开发语言>Java > Struts2实现文件上传时显示进度条功能

Struts2实现文件上传时显示进度条功能

2019年07月22日  | 移动技术网IT编程  | 我要评论

紫条丽华,盛唐游戏官网,封神榜父子情深

       最近在做一个资源共享的项目中,采用了struts2.1.8+spring2.5.6+hibernate3.32的框架整合方式进行开发。在文件上传这块,因为需要实现文件上传时显示进度条的功能,所以尝试了一下。怕以后忘记,先贴出来分享下。

       要在上传文件时能显示进度条,首先需要实时的获知web服务端接收了多少字节,以及文件总大小,这里我们在页面上使用ajax技术每一秒向服务器发送一次请求来获得需要的实时上传信息。但是当我们使用struts2后怎么在服务端获得实时的上传大小呢?这里需要用到commons-fileupload中的progresslistener接口,实现这个接口,然后再实现一个自己的解析器,并在解析器中添加自己实现的那个progresslistener;然后再替换struts2自带的解析器(struts2自带的解析器类没有添加progresslistener),然后就可以了。下面看看主要的代码(技术有限,如有不对之处,望不吝点解): 

监听器:

import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpsession;
import org.apache.commons.fileupload.progresslistener;

public class resourceprogresslistener implements progresslistener {
 private httpsession session;
 public resourceprogresslistener(httpservletrequest request) {
  session = request.getsession();
  resourcefileuploadstatus newuploadstatus = new resourcefileuploadstatus();
  session.setattribute("currentuploadstatus", newuploadstatus);

 }
 public void update(long readedbytes, long totalbytes, int currentitem) {
  resourcefileuploadstatus status = (resourcefileuploadstatus) session.getattribute("currentuploadstatus");
  status.setreadedbytes(readedbytes);
  status.settotalbytes(totalbytes);
  status.setcurrentitem(currentitem);

 }

}

上传状态类:

public class resourcefileuploadstatus {
 private long readedbytes = 0l;
 private long totalbytes = 0l;
 private int currentitem = 0;

 public long getreadedbytes() {

  return readedbytes;
 }
 public void setreadedbytes(long bytes) {
  readedbytes = bytes;
 }

 public long gettotalbytes() {
  return totalbytes;
 }
 public void settotalbytes(long bytes) {
  totalbytes = bytes;
 }
 public int getcurrentitem() {
  return currentitem;

 }

 public void setcurrentitem(int item) {
  currentitem = item;

 }

}

实现自己的解析器类:方法比较简单,找到struts2实现的解析器类,把代码拷贝过来然后添加上监听器即可。这个类代码较多就不整个文件拷了,主要是在parse方法里添加。parse方法代码如下:红色标注部分即是需要自己添加的progresslistener.

public void parse(httpservletrequest servletrequest, string savedir)
  throws ioexception {

 system.out.println("执行自定义multipartrequest");
  diskfileitemfactory fac = new diskfileitemfactory();
  // make sure that the data is written to file
  fac.setsizethreshold(0);
  if (savedir != null) {
   fac.setrepository(new file(savedir));
  }

  // parse the request

  try {

   servletfileupload upload = new servletfileupload(fac);
   upload.setsizemax(maxsize);

   resourceprogresslistener progresslistener = new resourceprogresslistener(servletrequest);//新建一个监听器

    upload.setprogresslistener(progresslistener);//添加自己的监听器

   list items = upload.parserequest(createrequestcontext(servletrequest));

    for (object item1 : items) {

    fileitem item = (fileitem) item1;
    if (log.isdebugenabled()) log.debug("found item " + item.getfieldname());
    if (item.isformfield()) {
     log.debug("item is a normal form field");
     list<string> values;
     if (params.get(item.getfieldname()) != null) {
      values = params.get(item.getfieldname());
     } else {

      values = new arraylist<string>();

     }
     string charset = servletrequest.getcharacterencoding();
     if (charset != null) {
      values.add(item.getstring(charset));
     } else {

      values.add(item.getstring());
     }

     params.put(item.getfieldname(), values);

    } else {

     log.debug("item is a file upload");

 

     // skip file uploads that don't have a file name - meaning that no file was selected.
     if (item.getname() == null || item.getname().trim().length() < 1) {
      log.debug("no file has been uploaded for the field: " + item.getfieldname());
      continue;

     }
 

     list<fileitem> values;
     if (files.get(item.getfieldname()) != null) {
      values = files.get(item.getfieldname());
     } else {
      values = new arraylist<fileitem>();

     }

 

     values.add(item);
     files.put(item.getfieldname(), values);
    }
   }
  } catch (fileuploadexception e) {
   log.warn("unable to parse request", e);
   errors.add(e.getmessage());

  }

} 

上面的类建立完成后,还需要做一项工作:在struts.xml中添加如下内容:

<bean type="org.apache.struts2.dispatcher.multipart.multipartrequest" name="requestparser"
 class="com.zeige.resourcemultipartrequest" scope="default" optional="true" />
<constant name="struts.multipart.handler" value="requestparser" />

 下面就可以正常使用了,建立两个action,一个用来接收上传文件,以及对接收的文件作相应处理,处理完成后,在return success之前去除session中currentuploadstatus属性,一个用来为页面读取实时上传进度服务,这个类中只要将session中的currentuploadstatus对象拿出来按照相应格式返回给客户端即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网