全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

       最近在做一个资源共享的项目中,采用了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对象拿出来按照相应格式返回给客户端即可。

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


# Struts2  # 上传  # 进度条  # Struts2 文件上传进度条的实现实例代码  # servlet+jquery实现文件上传进度条示例代码  # springMVC+ajax实现文件上传且带进度条实例  # springMVC实现前台带进度条文件上传的示例代码  # Android上传文件到服务端并显示进度条  # Android带进度条的文件上传示例(使用AsyncTask异步任务)  # struts2实现文件上传显示进度条效果  # 自己的  # 然后再  # 自带  # 就可以  # 上传文件  # 文件上传  # 是在  # 完成后  # 就不  # 如有  # 之处  # 并在  # 要在  # 要做  # 采用了  # 较多  # 做一个  # 自定义 


相关文章: 美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  如何零基础在云服务器搭建WordPress站点?  移民网站制作流程,怎么看加拿大移民官网?  如何有效防御Web建站篡改攻击?  如何使用Golang安装API文档生成工具_快速生成接口文档  建设网站制作价格,怎样建立自己的公司网站?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何快速生成专业多端适配建站电话?  如何在阿里云香港服务器快速搭建网站?  建站之星官网登录失败?如何快速解决?  临沂网站制作公司有哪些,临沂第四中学官网?  建站主机选哪种环境更利于SEO优化?  开封网站制作公司,网络用语开封是什么意思?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  C#如何使用XPathNavigator高效查询XML  建站之星如何快速更换网站模板?  如何通过虚拟主机快速搭建个人网站?  建站VPS配置与SEO优化指南:关键词排名提升策略  全景视频制作网站有哪些,全景图怎么做成网页?  招商网站制作流程,网站招商广告语?  如何高效搭建专业期货交易平台网站?  如何选择高效稳定的ISP建站解决方案?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  电商平台网站制作流程,电商网站如何制作?  建站之星如何快速生成多端适配网站?  建站之星×万网:智能建站系统+自助建站平台一键生成  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  建站之星24小时客服电话如何获取?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  php json中文编码为null的解决办法  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  制作网页的网站有哪些,电脑上怎么做网页?  建站主机空间推荐 高性价比配置与快速部署方案解析  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  已有域名如何免费搭建网站?  宁波自助建站系统如何快速打造专业企业网站?  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  常州企业网站制作公司,全国继续教育网怎么登录?  建站主机SSH密钥生成步骤及常见问题解答?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  如何在Windows环境下新建FTP站点并设置权限?  股票网站制作软件,网上股票怎么开户?  香港服务器租用费用高吗?如何避免常见误区?  如何通过虚拟主机空间快速建站?  如何快速辨别茅台真假?关键步骤解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。