- 浏览: 299999 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hongbo.wu:
...
jqGrid使用整理 -
呆萌小生:
谢谢分享
jqGrid中的formatter -
quan356270259:
兄弟。我刚开始自学,正想做一个这样的功能,能发份源码给我看看吗 ...
SWT CheckboxTreeViewer相关用法 -
534255233:
...
CXF:基于JAX-WS的webservice -
xiaofeidehe:
请问楼主一个小问题:formatter 格式化单元格,获取这一 ...
jqGrid中的formatter
1、struts2上传
以下是一个上传涉及的代码,从view到action的各个阶段代码:
页面:
<form action="../upload/upload.action" id="exForm" method="post" enctype="multipart/form-data" > <ul> <li> <input type="file" name="uploadFile" size="20"/> <input type="submit" value="导入"/> </li> </ul> </form>
action代码:
public class UploadFileAction extends ActionSupport { private static final long serialVersionUID = 5563083429360573304L; /** 上传文件 */ private File uploadFile; private String uploadFileFileName; private String uploadFileContentType; public String upload() { try { //这里是上传文件,可做具体处理 IOUtils.copy(new FileInputStream(uploadFile), new FileOutputStream(new File("C:\\" + uploadFileFileName))); System.out.println(uploadFileFileName); System.out.println(uploadFileContentType); } catch (Exception e) { e.printStackTrace(); } return SUCCESS; } }
配置文件就不再描述。以上就是在struts2中上传涉及的代码,同时还可以支持同时上传多个文件:
支持同时上传多个文件:
<form action="../upload/upload.action" id="exForm" method="post" enctype="multipart/form-data" > <ul> <li> <input type="file" name="uploadFiles" size="20"/> <input type="file" name="uploadFiles" size="20"/> <input type="file" name="uploadFiles" size="20"/> <input type="submit" value="导入"/> <input type="input" name="message"/> </li> </ul> </form>
和action代码:
public class UploadFileAction extends ActionSupport { private static final long serialVersionUID = 5563083429360573304L; /** 上传文件 */ private File[] uploadFiles; private String[] uploadFilesFileName; private String[] uploadFilesContentType; public String upload() { try { int index = 0; for (File file : uploadFiles) { IOUtils.copy(new FileInputStream(file), new FileOutputStream(new File("C:\\" + uploadFilesFileName[index]))); System.out.println(uploadFilesFileName[index]); System.out.println(uploadFilesContentType[index]); index++; } } catch (Exception e) { e.printStackTrace(); } return SUCCESS; }}
2、几点说明
1、在上面上传过程中,页面file域属性名与action中File保持一致。如上:
name="uploadFile" 和 private File uploadFile
多个文件需要是数组。
2、之所以如此简单,得益于struts2中默认package:struts-default中
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
在FileUploadInterceptor中讲HttpServletRequest请求对象封装成MultiPartRequestWrapper,对上传文件提供了对上传文件的各种处理:
这里提供了对文件、文件名、contentType等属性获取的封装,当然也有对普通表单字段的封装,即如果在上传的表单中有非file域也统一可以获取,而这在普通的servlet上传中并不能简单的处理,如上面的多个文件上传表单中的message,只需要在action中有相应的getter/setter即可获取这些属性。而完成这一切的是一个叫MultiPartRequest的家伙。
3、MultiPartRequest
这是上传拦截器中处理封装的具体类,这涉及struts2中上传的底层具体实现,在这个接口中,我们能看到struts2中提供了一个默认的实现:
public class JakartaMultiPartRequest implements MultiPartRequest
在struts2的default.properties中解析有如下说明:
### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data # struts.multipart.parser=cos # struts.multipart.parser=pell struts.multipart.parser=jakarta # uses javax.servlet.context.tempdir by default struts.multipart.saveDir= struts.multipart.maxSize=2097152
这里对MIME-type为multipart/form-data的几种支持,而默认为jakarta,即在使用struts2的上传,需要添加相应的依赖(版本自行控制):
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency>
4、关于file、filename、contentType
前面已经说了,在action中的File需要和也没file域中的名字保持一致,如果多个则是File数组。而如果要获取fileName以及相应的contentType,命名也有一定的限制,如上面的action中:
private File[] uploadFiles; private String[] uploadFilesFileName; private String[] uploadFilesContentType;
而这里的命名来自FileUploadInterceptor中对MultiPartRequestWrapper解析完放置于ActionContext中所作的处理:
见MultiPartRequestWrapper中:
if (files != null && files.length > 0) { List<File> acceptedFiles = new ArrayList<File>(files.length); List<String> acceptedContentTypes = new ArrayList<String>(files.length); List<String> acceptedFileNames = new ArrayList<String>(files.length); String contentTypeName = inputName + "ContentType"; String fileNameName = inputName + "FileName"; for (int index = 0; index < files.length; index++) { if (acceptFile(action, files[index], fileName[index], contentType[index], inputName, validation, ac.getLocale())) { acceptedFiles.add(files[index]); acceptedContentTypes.add(contentType[index]); acceptedFileNames.add(fileName[index]); } } if (!acceptedFiles.isEmpty()) { Map<String, Object> params = ac.getParameters(); params.put(inputName, acceptedFiles.toArray(new File[acceptedFiles.size()])); params.put(contentTypeName, acceptedContentTypes.toArray(new String[acceptedContentTypes.size()])); params.put(fileNameName, acceptedFileNames.toArray(new String[acceptedFileNames.size()])); } }
5、上传进度条显示
在上面第三点已经说明,在struts2中,默认的实现是JakartaMultiPartRequest,这是基于common-fileupload的实现。要处理上传进度条,在common-fileupload中有提供监听上传进度的接口:
/** * The {@link ProgressListener} may be used to display a progress bar * or do stuff like that. */ public interface ProgressListener { /** Updates the listeners status information. * @param pBytesRead The total number of bytes, which have been read * so far. * @param pContentLength The total number of bytes, which are being * read. May be -1, if this number is unknown. * @param pItems The number of the field, which is currently being * read. (0 = no item so far, 1 = first item is being read, ...) */ void update(long pBytesRead, long pContentLength, int pItems); }
根据在网上找到的一些资料,这里做了一个实现。首先需要实现该接口,获取显示的进度,一般我们按照百分比来计算,可以在实现的处理监听过程中将该值写入struts2的ActionContent中:
public class ResourceProgressListener implements ProgressListener { public ResourceProgressListener(HttpServletRequest request) { } public void update(long readedBytes, long totalBytes, int currentItem) { String process = readedBytes * 1.0 / totalBytes * 100 + ""; ActionContext.getContext().getSession().put("currentUploadStatus", process); } }
接下来需要替换掉struts2中默认的实现,并在自己的实现中将该监听接口注册进去。在struts2-core-2.2.1.jar这个版本中,找到默认实现类JakartaMultiPartRequest,我们可以将代码全部复制过来,在这个版本的处理中,我们可以看到直接将上传请求用common-fileupload处理是在方法parseRequest中。比如我们将自己的实现叫MultiPartProcessRequest,代码将默认实现JakartaMultiPartRequest中拷贝过来,替换下面的方法:
private List<FileItem> parseRequest(HttpServletRequest servletRequest, String saveDir) throws FileUploadException { DiskFileItemFactory fac = createDiskFileItemFactory(saveDir); ServletFileUpload upload = new ServletFileUpload(fac); upload.setSizeMax(maxSize); //--------------begin add process Listener-----------------// ResourceProgressListener progressListener = new ResourceProgressListener(servletRequest);//新建一个监听器 upload.setProgressListener(progressListener);//添加自己的监听器 //-------------- end add process Listener-----------------// return upload.parseRequest(createRequestContext(servletRequest)); }
上面注释部分是对默认实现的修改,增加了监听。下面需要在struts2中修改默认配置为当前自己的实现,一般我们将该参数配置在struts.xml:
<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="requestParser" class="com.sa.web.upload.MultiPartProcessRequest" scope="default" optional="true" /> <constant name="struts.multipart.handler" value="requestParser" />
到此上传进度监听就处理完成,接下来需要处理在页面的实现:在提交上传的form表单后,将定时调用Ajax请求去读取ActionContext中的进度信息,并在页面显示该实时进度。这里需要在上传的Action中新增一个action方法,读取实时进度,并Ajax返回,都是一些常规操作:
UploadFileAction:
/** * Ajax get current process info * @return * @author Administrator * @date 2012-6-3 */ public String process() { process = (String) ActionContext.getContext().getSession().get("currentUploadStatus"); return SUCCESS; }
在struts-upload.xml中返回json:
<!-- process --> <action name="process" class="com.sa.web.upload.UploadFileAction" method="process"> <result name="success" type="json"> <param name="ignoreHierarchy">true</param> <param name="excludeNullProperties">true</param> <param name="root">process</param> </result> </action>
接下来,就是在页面如何显示。这里做得很粗糙,只是将Ajax读取的数据展现。这里用到了javascript的定时函数setInterval。但是有个问题,在js中提交form表单中会阻塞该页面请求进程,就不会去请求setInterval中的方法。这里用到了jquery.form.js来异步提交表单,在提交表单后去定时获取后台进度信息,并在页面显示。同时,在表单提交完成后需要停止该定时任务。
<script type="text/javascript" src="../resources/js/jquery-1.4.2.min.js"></script> <script type="text/javascript" src="../resources/js/jquery.form.js"></script> <script type="text/javascript"> $(function () { //这个是为了在上传完成后停止该定时任务,或者有更好的办法? window.processBar = function(){return setInterval(function(){ if(isExNew){ jQuery.ajax({ type: "POST", cache: false, url: "http://localhost:8080/sa-web/upload/process.action", data: {}, dataType: "json", success: function (data) {$("#processId").append(data).append(",");} }) } }, 1000); }; //异步提交Form表单,在ajaxForm回调函数中去实时查询最新进度 window.fnExNew = function () { window.isExNew = true; $('#exForm').ajaxForm(function(){setInterval(function(){ if(isExNew){ jQuery.ajax({ type: "POST", cache: false, url: "http://localhost:8080/sa-web/upload/process.action", data: {}, dataType: "json", success: function (data) {$("#processId").append(data).append(",");} }) } }, 1000)}); }; //上传完成的回调方法, window.fnEx = function (p) { if(isExNew){ alert("提示", "上传完成"); }else{ alert("提示", p); } window.isExNew = false; clearInterval(processBar); }; }); </script>
至于回调函数fnEx是在UploadFileAction中upload上传完成处理后返回一个页面,只有一句话那就是调用该方法:
<script> try{ parent.fnEx("$!message"); } catch(e){} </script>
到此为止整个简单的展现处理已经完成,当然在实际生产中这样的展现可不行,需要显示进度条可在ajaxForm提交的回调中弹出DIV调用一些jquery组件直观显示,这是后话不表
评论
我去自己实现的那个监听器中的update方法里面打出一句话,可是更本没有输出,配置文件我也配置了的呀!!
按照文章配置,报错了
发表评论
-
Spring AOP
2013-05-08 21:16 1211本文是学习SpringAOP的一些整理,主要参考了以下几本 ... -
XStream
2013-03-27 12:57 3130XStream是一个将对象序列化为xml并解析xml为对象 ... -
JDK6中httpserver实例
2012-11-17 17:39 4040前面说到HttpServer是JDK6提供的一个轻量的http ... -
javac及其相关
2012-09-10 17:40 0一、没有package 比如在目录c:\code下有一个ja ... -
Struts2基于Annotation的服务端校验
2012-07-23 10:15 1231在使用Struts2开发时,经常会遇到在服务端Action方法 ... -
java内省Introspector
2012-07-11 16:24 0本文是在使用struts2-json- ... -
struts2中ActionContext和各种Context转化
2012-07-22 20:53 2181这里主要来了解struts2的上下文容器:ActionCont ... -
struts2-json-plugin2.2.1使用的几个问题
2012-07-22 20:54 1748首先我们看看struts2中插件struts2-json-pl ... -
ibatis整理
2012-06-18 17:50 01、sql注入 <select id=& ... -
common-fileupload 上传总结
2012-05-22 22:17 1607记得很早之前在直接采 ... -
springmvc 3.1整合velocity
2012-05-11 23:32 12563一直想折腾下spring mvc,今天下午的酱油时间对这个做了 ... -
tomcat 数据源配置
2012-05-09 15:01 1238在使用中的一些总结,都是些老生常谈的内容,留着备用 首先假设 ... -
Servlet初始参数及其他
2012-02-22 15:36 1415最近在做一个东西的时候,用到servlet中的参数突然就分不清 ... -
some tips
2012-01-17 15:56 953工作中遇到的一些问题 ... -
java 读取文件相对路径
2012-01-09 21:44 4359最近遇到在java代码中读取自带文件,只知道可以采用getRe ...
相关推荐
struts2上传文件进度条显示,里面有详细的代码
java struts2实现文件上传进度条显示
能够实现上传的进度条显示,用struts2实现的,用到了进程监听
Struts2文件上传,使用Strut2的拦截器来实现进度条显示,完整代码,包含了所有的jar包,可直接运行
参考文章地址: http://blog.csdn.net/garryyrc/article/details/5499113 http://www.telio.be/blog/2006/01/06/ajax-upload-progress-monitor-for-commons-fileupload-example
1.struts2 带进度条文件上传 源码 2.源码中有lib 下载后部署马上就能用 3.代码中有详细的注释信息 4.对关键点有详细的解释说明 5.如果谁用起来觉得有问题可在评论留言,留联系方式,我会联系你的 6.非常感谢原创作者...
struts2多文件上传显示进度 无插件
struts2上传文件的进度条显示,绝对可用! 所达到效果 1.显示总文件大小 2.显示已上传文件大小 3.显示当前进度(百分比控制) 4.显示剩余上传时间 5.显示当前速度 (本人研究了很久才搞出来的,希望大家指教)
struts2+jquery多文件上传显示进度条,可直接运行(非常强大,效果很好),带jar包
因为权限不够,jar包分3次上传,此为1
struts2+dwr上传带进度条监控 具体功能就实现在源码中都有注释 我就不在这里多介绍了 其实网上也有很多这类功能的源码 和介绍 不过我还是弄了N久才弄明白 然后经理解自己实现了一下 主要是做好页面的dwr方法调用的...
利用Struts2上传文件时有时会速度过慢,这时候如果没有进度条显示的话会使得界面很不友好,所以我找了很多资料并调试成功,该文件就是项目文件,解压后直接用myeclipse8.5打开运行即可!
用struts2 写了个文件上传 有进度显示 可能比较烂 不喜勿喷
Java版 swfupload 上传显示 文件大小,速度,剩余时间 进度条 ssh2 开源 文件上传 下载 只要把下载的文件集成到 ssh2 的项目里面去就可以了。
因为权限不够,jar包分3次上传,此为2。。
Common-FileUpload带进度条文件上传
主要为大家详细介绍了struts2实现文件上传显示进度条效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
struts2 批量上传 图片+ 文件 显示进度条
利用struts2框架实现uploadidfy多文件上传,显示进度条上传