`
richard_2010
  • 浏览: 63888 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

基于SpringMVC文件上传服务器端进度条实现

阅读更多

        文件上传应该大部分人都接触过,一般都是基于commons-fileupload组件来实现,SpringMVC的文件上传功能也是在commons-fileupload组件提供的功能上面做了一些包装功能,使文件上传开发更容易方便。
        首先来看看我们系统对于文件上传功能提出来的需求:
1、能同时上传多个文件;
2、单个文件大小不超过2G;
3、要有进度条可以实时显示上传进度;
4、可以取消正在上传的文件;
5、文件上传到分布式存储系统,保证上传的效率。

        一、实现普通文件上传
        我们知道,类DispatcherServlet是SpringMVC的入口,在其doDispatch方法里面,我们可以看到它会先去检查有没配置multipartResolver 

        如果有的话会先执行它的resolveMultipart方法:

        因此,我们在配置文件中添加:
                则可使用SpringMVC自带的CommonsMultipartResolver实现多个文件上传的功能。

        二、实现进度条
        现在实现带进度条的文件上传一般都是在客户端用flash上传组件计算,或者是通过客户端插件的方式。前者上传组件有大小的限制,后者对于我们系统来说实现过于复杂,开发难度稍大。因此我们采用服务器端计算文件上传进度,客户端轮询的方式。
        Commons-fileupload组件自带了文件上传进度的监听器,类FileUploadBase提供了它的set方法:        

        ProgressListener是一个接口,我们需要自己实现它的update方法,参数pBytesRead表示已经上传到服务器的字节数,pContentLength表示所有文件的总大小,pItems表示第几个文件:

        SpringMVC没有实现监听器,所以如果要监听的话得自己扩展CommonsMultipartResolver类,在newFileUpload里面加入代码设置自己实现的监听器:

        ServletFileUploadExt是对ServletFileUpload类进行的扩展,后面会提到。这样在文件上传的过程中,监听器将得到通知已上传的字节数:


        三、上传到分布式存储系统
        通过阅读commons-fileupload的源码我们知道实际文件上传发生在FileUploadBase类parseRequest(RequestContext ctx)方法里面:

 

        因此我们可以通过继承ServletFileUpload(该类继承自FileUpload)类重写parseRequest方法来实现我们自己的存储方式。这里有个地方需要注意的,一般文件保存到分布式存储系统中,为了减少IO次数,需要实现本地的buffer,等buffer满了后再上传上去:

         但是因为commons-fileupload组件本身有个buffer,而且buffer大小为4096:

 

        因此按照上面实现的话不管自己定义多大的buffer,一次IO传上去的实际不到4096字节(减去http头信息等),我们需要用扩展了BufferedInputStream的类包装下:

        BufferedInputStreamExt主要对read方法做了一些修改:

        去掉了BufferedInputStream类该方法的几条语句,因为在上传组件自带buffer的情况下,读一次后input.available()会为0,此处会导致提前返回而不能把自定义的buffer读满:


        四、取消文件上传
        取消文件上传实现方式为上传时保存上传输入流的引用,取消时关闭流,让输入流产生IO异常或者数组越界异常,同时捕获这些异常,则可取消文件上传。

        五、总结&改进
        由于SpringMVC上传的时候并不能得到单个文件的大小,配置文件限制的大小也是所有文件的大小,非单个文件大小,监听的也是整体文件上传的进度。所以在客户端可以做一些改进,比如模拟一次可以上传多个文件,但实际上传时只上传单个文件,等第一个文件上传完毕后再依次发请求上传第二第三个文件。

 

        欢迎对本文提出的实现方式进行讨论和指导,如有更好的实现方式,亦欢迎指教,谢谢!

 

  • 大小: 13.1 KB
  • 大小: 19.4 KB
  • 大小: 8.8 KB
  • 大小: 7 KB
  • 大小: 15.5 KB
  • 大小: 10 KB
  • 大小: 10.5 KB
  • 大小: 5.8 KB
  • 大小: 25.1 KB
  • 大小: 8.1 KB
  • 大小: 5.2 KB
  • 大小: 4.8 KB
  • 大小: 3.2 KB
  • 大小: 16.7 KB
  • 大小: 4.3 KB
分享到:
评论
2 楼 yijiang_0212 2012-12-10  
有没有源码? 发给我一份,邮箱是yijiang_021219@sina.com
1 楼 wang91wang 2012-08-13  
有没有详细一点的呀

相关推荐

    SpringMVC多文件上传带进度条

    在本文中,我们将深入探讨如何使用SpringMVC和Ajax实现多文件上传并显示上传进度条的功能。这是一个在Web开发中常见的需求,特别是在处理大文件或批量上传时,用户界面的实时反馈至关重要,以提供更好的用户体验。 ...

    WEB文件上传之SpringMVC+ajaxfileupload使用(三)

    - 服务器端处理完文件上传后,返回一个JSON或XML响应,包含状态信息和可能的错误消息。 - 前端JavaScript监听HTTP请求的状态,根据响应更新UI,如显示上传成功或错误提示。 ### 注意事项 - 文件上传时需考虑安全...

    带进度条的上传例子

    本文将基于标题“带进度条的上传例子”及其描述,深入探讨如何在不同的Web框架下——如servlet、Struts2和SpringMVC中,实现带有进度条的文件上传功能。 ### 带进度条文件上传的基本原理 实现带进度条的文件上传...

    SpringMVC框架搭建,并实现附件上传下载

    - **集成uploadify**:uploadify是一个基于jQuery的文件上传插件,提供了分块上传、预览、进度条等功能。在HTML页面中引入uploadify的JavaScript和CSS文件。 - **后端处理上传**:创建一个Controller方法接收上传...

    ssm实现多文件上传实时更新进度信息

    总之,SSM实现多文件上传实时更新进度信息涉及到的技术包括SSM框架的文件上传处理、jQuery的AJAX交互、HTML5的多文件上传API以及前后端的进度同步机制。这样的功能提高了用户体验,让用户在上传大文件时能清晰了解...

    spring mvc uploadify上传文件

    Uploadify是一款基于jQuery的文件上传插件,它允许用户通过异步方式上传多个文件,并提供进度条显示、预览、取消等高级功能。使用uploadify,开发者可以自定义上传样式,设置上传参数,如文件类型限制、上传大小限制...

    uploadify在SpringMVC下的使用示例

    uploadify是一个基于jQuery的文件上传组件,支持异步多文件上传,具备进度条显示、取消上传、自定义上传参数等功能。其工作原理是通过Flash或HTML5技术在浏览器端处理文件,然后通过Ajax方式与服务器进行交互。 2....

    webuploader实现大文件分片上传

    - WebUploader是百度开发的一款轻量级的前端上传组件,支持多文件上传、拖拽上传、预览、进度条显示等功能。 - 支持HTML5的File API,对于不支持File API的浏览器,WebUploader会自动降级处理。 2. **大文件分片...

    springMVC框架下plUpload断点续传

    plUpload是一款基于JavaScript的多浏览器文件上传组件,它支持HTML5、Flash、Silverlight、Gears和BrowerPlus等多种技术,确保在各种环境下都能实现文件上传。plUpload的主要特性包括分块上传、断点续传、进度条显示...

    springmvc+ajax异步上传 希望代码对大家有用

    2. **AjaxFileUpload.js配置**:配置AjaxFileUpload.js,指定服务器端处理文件上传的URL,以及成功和失败的回调函数,以处理上传结果。 3. **Spring MVC Controller**:在Controller层,定义一个处理文件上传的@...

    webuploader在springMVC+jquery+Java开发环境下的大文件分片上传的实例代码

    知识点5:文件上传的服务器端配置 为避免冲突,文档提到在ApplicationContext-mvc.xml配置文件中屏蔽了SpringMVC的上传拦截配置,其中定义了最大上传大小等参数。例如,maxUploadSize设置为1GB,maxInMemorySize同样...

    highway.rar

    "highway.rar"是一个包含SSM(Spring、SpringMVC、MyBatis)框架和Layui前端组件库实现的文件上传功能的项目。本项目的核心目标是提供一个高效、易维护、高复用性的文件上传解决方案,以确保即使在开发人员变动的...

    uploadifive

    Uploadifive是一款基于HTML5...总的来说,Uploadifive是一款强大且易用的文件上传解决方案,它简化了文件上传的实现过程,为开发者提供了更多定制化选项,使得在Web应用中实现高效、友好的文件上传功能变得轻而易举。

    用uploadify3.2.1批量上传图片,预览图片,单独删除图片

    Uploadify是一款基于JavaScript和Flash的文件上传插件,支持多文件选择、进度条显示、预览功能,并且可以自定义样式,使得文件上传更加用户友好。在3.2.1版本中,它提供了丰富的配置选项和事件处理,能够满足大部分...

    基于ssm+vue政府项目管理平台.zip

    通过DispatcherServlet、Controller、ModelAndView等组件,实现前后端数据的交互。 4. **MyBatis** MyBatis是一个轻量级的持久层框架,它将SQL语句与Java代码分离,允许开发者直接编写SQL,提高了数据库操作的灵活...

Global site tag (gtag.js) - Google Analytics