最近在做一个资源共享的项目中,采用了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实现文件上传显示进度条效果
# 自己的
# 然后再
# 自带
# 就可以
# 上传文件
# 文件上传
# 是在
# 完成后
# 就不
# 如有
# 之处
# 并在
# 要在
# 要做
# 采用了
# 较多
# 做一个
# 自定义
相关文章:
建站之星代理商如何保障技术支持与售后服务?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
如何正确下载安装西数主机建站助手?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
Android使用GridView实现日历的简单功能
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
如何登录建站主机?访问步骤全解析
建站之星如何快速解决建站难题?
建站之星安装步骤有哪些常见问题?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
制作网站的基本流程,设计网站的软件是什么?
如何在IIS中新建站点并解决端口绑定冲突?
如何快速搭建支持数据库操作的智能建站平台?
黑客如何通过漏洞一步步攻陷网站服务器?
动图在线制作网站有哪些,滑动动图图集怎么做?
建站主机选虚拟主机还是云服务器更好?
C++时间戳转换成日期时间的步骤和示例代码
建站之星备案是否影响网站上线时间?
安云自助建站系统如何快速提升SEO排名?
建站之星ASP如何实现CMS高效搭建与安全管理?
建站之家VIP精选网站模板与SEO优化教程整合指南
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
自助网站制作软件,个人如何自助建网站?
如何用腾讯建站主机快速创建免费网站?
教程网站设计制作软件,怎么创建自己的一个网站?
浅析上传头像示例及其注意事项
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
建站主机与虚拟主机有何区别?如何选择最优方案?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
建站之星云端配置指南:模板选择与SEO优化一键生成
简单实现Android文件上传
Python多线程使用规范_线程安全解析【教程】
如何快速查询网站的真实建站时间?
清除minerd进程的简单方法
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
如何选择高性价比服务器搭建个人网站?
如何基于云服务器快速搭建个人网站?
如何在橙子建站中快速调整背景颜色?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何快速查询网址的建站时间与历史轨迹?
建站之星安装需要哪些步骤及注意事项?
代购小票制作网站有哪些,购物小票的简要说明?
威客平台建站流程解析:高效搭建教程与设计优化方案
如何用免费手机建站系统零基础打造专业网站?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
如何选择高效稳定的ISP建站解决方案?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
建站主机SSH密钥生成步骤及常见问题解答?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
*请认真填写需求信息,我们会在24小时内与您取得联系。