用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对象拿出来按照相应格式返回给客户端即可。

时间: 2024-10-27 06:06:43

用Struts2实现文件上传时显示进度条功能的相关文章

Asp.Net 无刷新文件上传并显示进度条的实现方法及思路

相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦苦来 实现呢?我并不否认"拿来主义",只是我个人更喜欢凡是求个所以然.本篇将阐述通过Html,IHttpHandler和 IHttpAsyncHandler实现文件上传和上传进度的原理,希望对你有多帮助. 效果图: 本文涉及到的知识点:1.前台用到Html,Ajax,JQuery,JQuery UI 2.后台用到一般处理程序(IHttpHandler)和

【原创】用JAVA实现大文件上传及显示进度信息

用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 一. 大文件上传基础描述: 各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容. 比如: Spring 框架中使用类似CommonsMultipartFile对象处理表二进制文件信息. 而.NET 中使用HtmlInputFile/ HttpPostedFile对象处理二进制文件信息. 优点:使用框架内置对象可以很方便的

webuploader插件单个文件上传(带进度条)

@{ ViewBag.Title = "主页"; } <script src="~/Scripts/jquery-1.9.1.min.js"></script> <link href="~/Scripts/1/bootstrap.css" rel="stylesheet" /> <link href="~/Scripts/1/webuploader.css" rel

servlet多文件上传(带进度条)

需要commons-fileupload-1.3.jar和commons-io-2.4.jar的支持 页面效果:(图片文件都可以) (1)进度标识类 public class UploadStatus { private long bytesRead; private long contentLength; private int items; private long startTime = System.currentTimeMillis(); //set get 方法 省略 } (2)监听

异步上传,显示进度条

服务端代码 [HttpPost] public ActionResult DoLoad(HttpPostedFileBase upimage, string test) { string filePhysicalPath = Server.MapPath("~/Upload/" + test); if (System.IO.File.Exists(filePhysicalPath)) { System.IO.Stream uploadStream = upimage.InputStre

字符串操作以及打印 —— 实现上传下载的进度条功能

import sys def processBar(num, total): rate = num / total rate_num = int(rate * 100) if rate_num == 100: r = '\r%s>%d%%\n' % ('=' * rate_num, rate_num,) else: r = '\r%s>%d%%' % ('=' * rate_num, rate_num,) sys.stdout.write(r) sys.stdout.flush process

Extjs中用dwr实现文件上传时,fileuploadfield不能正常显示的问题

当使用DWR调用Extjs的fileuploadfield 来做文件上传时,不能实现上传操作,需要修改dwr对应jar包中的engine.js文件 将1808行 var clone =value.cloneNode(true); 1812行  value.parentNode.insertBefore(clone,value); 注释掉 通过  var file = dwr.util.getValue("uploadFile");  获取fileuploadfield 对应的值 版权声

Struts2入门(七)——Struts2的文件上传和下载

一.前言 在之前的随笔之中,我们已经了解Java通过上传组件来实现上传和下载,这次我们来了解Struts2的上传和下载. 注意:文件上传时,我们需要将表单提交方式设置为"POST"方式,并且将enctype属性设置为"multipart/form-data",该属性的默认值为"application/x-www-form-urlencoded",就是说,表单要写成以下这种形式: <form action="" metho

plupload+struts2实现文件上传下载

plupload是一款优秀的web前端上传框架.使用简单.功能强大.不仅支持文件多上传,进度条.拖拽方式选择文件更重要的是他会自己主动的识别浏览器来选择最合适的上传方式.废话少说先上图: 代码都是測试过的非常好用,仅仅要把jquery路径和版本号改动下面,去plupload官网把jar把下载下来就能够用了. 先看一下uploadUI.jsp源码.uploadUI.jsp就是上图显示的页面: <%@ page language="java" import="java.ut