文章出自:http://my.oschina.net/xiaotian120/blog/198225
redmine:
1、框架采用spring mvc + mybatis
2、初始化数据脚本fileupload.sys\src\main\resources\init.sql
数据库配置文件fileupload.sys\src\main\resources\jdbc.properties
log4j配置文件fileupload.sys\src\main\resources\log4j.properties
log4j采用分错误级别进行记录日志,比如错误日志只需要在fusys_error.log下找
spring mvc配置文件:总配置--fileupload.sys\src\main\resources\spring-root-context.xml,
数据库配置文件--fileupload.sys\src\main\resources\spring\spring-db-context.xml
mvc配置文件--fileupload.sys\src\main\resources\spring\spring-mvc-context.xml
3、本地发布后就可以进行访问:http://localhost:8080/fileupload.sys
文件上传应该大部分人都接触过,一般都是基于commons-fileupload组件来实现,SpringMVC的文件上传功能也是在commons-fileupload组件提供的功能上面做了一些包装功能,使文件上传开发更容易方便。
看下上传效果图:
项目运行效果:
项目源码地址,发布即可用:https://github.com/wuskyfantasy/fileupload.sys
如果下载不了也可以下截fileupload.sys-master.zip附件。
项目使用spring mvc+mybatis实现,数据库采用mysql,具体参考README就可以发布起来。
一、实现普通文件上传
我们知道,类DispatcherServlet是SpringMVC的入口,在其doDispatch方法里面,我们可以看到它会先去检查有没配置multipartResolver
如果有的话会先执行它的resolveMultipart方法:
因此,我们在配置文件中添加:
则可使用SpringMVC自带的CommonsMultipartResolver实现多个文件上传的功能。
二、实现进度条
现在实现带进度条的文件上传一般都是在客户端用flash上传组件计算,或者是通过客户端插件的方式。前者上传组件有大小的限制,后者对于我们系统来说实现过于复杂,开发难度稍大。因此我们采用服务器端计算文件上传进度,客户端轮询的方式。
Commons-fileupload组件自带了文件上传进度的监听器,类FileUploadBase提供了它的set方法。
ProgressListener是一个接口,我们需要自己实现它的update方法,参数pBytesRead表示已经上传到服务器的字节数,pContentLength表示所有文件的总大小,pItems表示第几个文件:
文件上传进度监听器实现类,FileUploadProgressListener.java。
SpringMVC没有实现监听器,所以如果要监听的话得自己扩展CommonsMultipartResolver类,在newFileUpload里面加入代码设置自己实现的监听器:
ServletFileUploadExt是对ServletFileUpload类进行的扩展,后面会提到。这样在文件上传的过程中,监听器将得到通知已上传的字节数:
自己实现的Resolver类为CustomMultipartResolver,在这个类中需要在每一次上传请求中设定处理上传进度的监听器,并处理文件上传。
protected FileUpload newFileUpload(FileItemFactory fileItemFactory) { ServletFileUpload upload = new ServletFileUpload(fileItemFactory); upload.setSizeMax(-1); if (request != null) { HttpSession session = request.getSession(); //注意:这里的listener不能公用,即不能放到方法外面 FileUploadProgressListener progressListener = new FileUploadProgressListener(session); upload.setProgressListener(progressListener); } return upload; }
在配置文件spring-mvc-context.xml中配置使用自定义的Resolver。
<bean id="multipartResolver" class="com.sunshine.fusys.controllers.CustomMultipartResolver"> <property name="defaultEncoding" value="UTF-8" /> <property name="maxUploadSize" value="1000000000000" /> </bean>
最终在上传时,会通过commons-fileupload的组件进行上传时,会把上传进度读取到设定的session中,最后通过一个controller访问这个设定的进度值,就可以获取了。获取进度的controller为ProgressController。客户端采用异步的方式获取进度信息进行展示,具体参考源码index-userFile.jsp。
三、取消文件上传
取消文件上传实现方式为上传时保存上传输入流的引用,取消时关闭流,让输入流产生IO异常或者数组越界异常,同时捕获这些异常,则可取消文件上传。
最后补一个配置,spring mvc的项目访问时默认访问某个指定页面或者controller的配置如下:
//转向controller <mvc:view-controller path="/" view-name="redirect:/indexMain/index" />
或者
//转向index.jsp <mvc:view-controller path="/" view-name="/index" />
具体可参考配置文件:spring-mvc-context.xml
感谢此文章作者提供这么好的资源
相关推荐
spring mvc文件上传,通过监听器实现进度条
spring mvc html5带进度条上传的例子,ECLIPSE MAVEN 工程,带前端和后台
本篇文章主要介绍了spring MVC + bootstrap实现文件上传示例(带进度条),非常具有使用价值,有需要的朋友可以了解一下。
Spring MVC实现个人网盘, 上传,下载,支持进度条asdfsdf
该demo基于springmvc,监听spring的processerListener接口,实现对上传数据的更新,同时采用进度条显示当前上传情况。
【源码】mysql版本_spring3.0 系统模块 1....服务器内部GET POST 请求 25.uploadify 上传插件,单条、批量上传,带进度条,异步,图片、视频, 其它文件格式均可上传 26.地图选点获取经纬度坐标,根据俩经纬度计算距离
文件上传效果类似163邮箱。使用了spring MVC作为后台。layui+jquery作为前端技术。支持多文件上传。下载后直接导入myeclipse即可使用。
【源码】oracle版本_spring3.0 系统模块 1....服务器内部GET POST 请求 25.uploadify 上传插件,单条、批量上传,带进度条,异步,图片、视频, 其它文件格式均可上传 26.地图选点获取经纬度坐标,根据俩经纬度计算距离
本篇文章主要介绍了springMVC+ajax实现文件上传且带进度条实例,具有一定的参考价值,有兴趣的可以了解一下。
这是一个基于Spring MVC和HTML5的多文件上传的实例,前端实现全部采用JavaScript完成,有进度条显示,同时有上传状态。后台由一个文件上传的Controller控制,非常方便。对不想使用插件上传的人,可以看看这个参考。
轻松实现 大文件分片上传 可控制分片长度(大小)+并发数+进度条,后台采用RandomAccessFile并发写,多分片上传完成即可打开文件,不用合并文件。 ——前端采用jquery实现参考 可自行集成到vue等前端框架 ——后端采用...
Spring MVC MyBatis druid-数据库连接池 PageHelper-Mybatis通用分页插件 FreeMarker-模板引擎 前端 Bootstrap jQuery jQuery Form Vue.js pace.js–网页自动加载进度条插件 bootstrapValidator.js-最好用的...
5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...
5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...
SpringMVC | MVC框架 | [http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc) ...
基于SpringBoot+MyBatis实现。 后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。 #### 后端技术 技术 | 说明 | 官网 ----|----|---- ...
使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能 一完美的关于请求的目录不存在而需要url重写的解决方案! 在C#中实现MSN消息框的功能 XmlHttp实现无刷新三联动ListBox 鼠标...