新鲜出炉的jquery fileupload 插件

内容属原创,转载请注明出处

为什么做这个东东

项目中需要用到一个多附件上传的控件,找了一圈没找到中意的(唯一一个中意点的还不开源,费用比较高),这不,只得自己抡刀上了。

需求是什么

这么个上传的东东,要做哪些事情呢?

必须要干的事情:

1. 不能太丑,可以很素。

原生的input file实在和项目主体不太搭配,需要另外想办法。

2. 需要支持上传多个附件,比如后台有个字段叫做 影像资料,这个影像资料,也许就是一张正面照,也许,还有一堆的证件照,需要支持多个。

3. 需要一个页面上支持多个这样的控件,今天有个影像资料,明天可能就出来一个 资质证书,这不,就得俩了。

4. 需要能查列表,上传、下载、删除

最好有的内容:

5. 实时进度条

6. 图片类型的附件可以预览。

7. 可以限制上传的附件类型。

8. 支持配置上传单个或者多个

上面这些东西,一个一个来呗。

怎么开工

做这么个东东,至少要涉及到两块内容:

1. 前端展示

2. 后端处理

既然咱项目用了spring,用了jquery,那么,就从这两玩意入手呗,于是,决定这样干:

1. 前端自定义一个jquery插件

2. 后台基于springMVC和commons-fileupload-1.2.1.jar实现上传的具体业务

闲话莫提,开始捉刀。

前端插件的那些事

jquery是个好东东,要搞个插件有非常具体的套路,直接往上面套就好了,关键在于,逻辑怎么实现?

以前的项目用的是flash的插件,如今既然不想再依赖flash,那么,就用form提交来搞吧,步骤变成了这样子的:

1. 初始化时调用后台query接口,生成列表,列表上支持下载和删除。

2. 初始化时生成一个类型为 file的input,并绑定一个change事件 callback

3. 在callback中,动态生成一个form和一个iframe,并且把原来的file移到新的form中,另外再生成一个file放到原来的位置。把该form扔到队列

4. 如果当前没有提交的任务存在,那么生成一个提交的任务。

提交的任务中又在干嘛呢?

主要有下面几个事情要做:

1. 当前有没有正在提交还没提交成功的form?如果有,继续下面的步骤,如果没有,从队列中拿一个未提交的form,提交,如果队列空了,任务结束。

2. 当前提交的form的目的地(iframe)的内容有没有发生改变(通过检测某个具体的dom)?如果发生了改变,说明提交已经结束,进入结束的处理。如果没发生改变,那么,取进度条吧。

2.1 提交已经结束,看下,成功还是失败?成功了,设置进度条,生成删除按钮,再从第一个步骤开始。失败了,提示下上传失败。

2.2 提交还未结束,调用接口取下进度吧,同时,过个500毫秒从第一个步骤开始再来一次。

嗯,前端所有的逻辑基本上都在这里了。

后端的那些事

既然用了commons-fileupload-1.2.1.jar,那么只要做如下事情:

1. 新增类UploadProgressListener实现ProgressListener接口,在该接口的实现类中,首先从url里根据规则解析出来uploadId参数,然后往session例如该uploadId对应的进度。

session里存的是个map,key为uploadId,value为进度值。
2. 继承 CommonsMultipartResolver 实现一个类xx.xx.xx.CommonsMultipartResolver,在该实现类中通过类似下面代码注入进度条监听:

      String encoding = determineEncoding(request);
      FileUpload fileUpload = prepareFileUpload(encoding);
      ProgressListener pListener = new UploadProgressListener(request);
      fileUpload.setProgressListener(pListener);

3. 在spring的配置文件中配置multipartResolver为上面步骤中新实现的类:

<bean id="multipartResolver" class="xx.xx.xx.CommonsMultipartResolver" p:defaultEncoding="UTF-8" >

嗯,差不多就这样了。只是,这里面有个比较大的坑:

在 UploadProgressListener 这个类中拿到的request的parameter一直是空的。。要等这个步骤做完之后request的参数才有值,这样,支持多个附件上传的那个参数uploadId怎么样都拿不到。。最后,幸好MVC支持在url里带参数,于是上传的url就变成了:

  @RequestMapping(value="/file/{uploadId}/upload.json")

这样,可以通过规则在request中拿到getRequestURI()之后再解析出来uploadId的值

差不多可以收工了。

写在题外的

用的时候,还要注意什么下面这么些东西:

1. 后台存储附件需要这么张关系表,里面保存了 file_group_id,file_id,file_name,file_path,file_size 至少这么些数据。

2. 控件基于jquery 1.7.2,未测试其他版本

3. 配置控件 上传、新增、删除、下载以及获取进度条的action时,注意需要相对工程的根目录配置,前面不要带 /
4. 控件的action需要返回json数据,需要注意如下内容:
  a. 新增返回的json为如下格式,至少需要返回fileId和fileGroupId字段:
  

{model_list:[{"file_group_id":"XXXXX","file_id":"XXXXXXX"}]}

  同时,注意返回时,需要设置返回数据的头部信息为 HTML,java中为:

  

response.setContentType("text/html;charset=UTF-8");

b. 删除时后台通过参数 file_id 接收要删除的 文件编号,不抛异常则认为是删除成功

c. 下载时后台通过参数 file_id 接收要下载的文件编号,返回文件流
d. 获取文件列表时,后台通过url里的参数 fileGroupId查询该组号下的所有附件,的返回json数据为:

{model_list:[{file_group_id:‘XX‘,file_id:‘XXX1‘,file_name:‘XX文件‘,file_path:‘test/test/XX文件_20140810010101.html‘,file_size:1001},{file_group_id:‘XX‘,file_id:‘XXX2‘,file_name:‘XX文件‘,file_path:‘test/test/XX文件_20140810010102.html‘,file_size:1001}]}

e. 获取文件上传进度,返回的格式为json格式:

{"percent":10}

注意,为了支持多个文件上传读取进度,每一个文件上传时有一个唯一的 uploadId,获取文件上传进度需要根据该参数进行,提交时的参数名为 upload_id

下载

这个fileupload的前端插件的地址已经放在github上,路径:

https://github.com/kevin82008/fileupload

效果图:

水平所限,如有不对,欢迎拍砖。

新鲜出炉的jquery fileupload 插件,布布扣,bubuko.com

时间: 2024-11-12 11:24:22

新鲜出炉的jquery fileupload 插件的相关文章

11个新鲜出炉的jQuery图像滑块插件

如今图像滑块已成为一种流行的Web设计元素,通过滑块,你可以在有限的页面空间中展示更多的内容,带给用户更佳的浏览体验.本文将为你带来一些非常实用的jQuery图像滑块插件. 1.  Basic Slider 顾名思义,这是一个最基本的滑块,相当简单.轻量,只提供了最基本的功能. 2.  BXSlider 这是一个响应式的.复杂的滑盖插件,支持富内容.触摸/滑动手势.原生硬件加速和回调API,整体来说相当不错. 3.  WOWSlider 一个很酷的滑块插件,提供了各种不同的视觉效果,如旋转.模糊

使用 jQuery FileUpload 插件实现异步上传

首先,先做两个提前准备工作  1.下载插件 2.向项目导入需要的css样式和js样式 下面,开始实现 使用 jQuery FileUpload 插件实现异步上传 <!- jsp 页面  以添加一个学生为例子 -!> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html P

华为机试正式版(西安c/c++/java),今天下午去机试的题目,新鲜出炉了!

以下题目都是回忆的,题目都很简单, 大家有些基础就可以参加!(语言可以是c/c++,也可以是java的) 题目一(60分): 字符串操作, 将小写转换成大写, 将大写转化为小写, 数字的不做转换 例如, 输入:aBcD12 输出:AbCd12 题目二(100分): 将输入的字符串按照规定重新排序,如果字符串长度为奇数, 则中间的字符保持不变, 中间字符左侧降序排列, 右侧字符按照升序排列, 如果字符串长度为偶数,则左半侧字符降序排列,右半侧字符则按照升序排列 例如, 输入:ab5de 输出:ba

GITC 2014全球互联网技术大会 详细议程新鲜出炉

GITC 2014即将于10月9日-10日在国家会议中心隆重举行! 超大规模,盛况空前的GITC全球互联网技术大会详细议程新鲜出炉:劲爆热点技术话题点评:技术大咖主题分享:百余位行业顶尖人物! 互联网技术的顶尖盛会以“技术进化论”为主题汇集了行业精英展示互联网行业最新技术分享最前沿思想解析互联网技术领域的最新发展趋势! 最终详细议程以大会现场实际为准.

优蜜(有米科技)面筋,香喷喷的,新鲜出炉

 优蜜(有米科技)面筋,香喷喷的,新鲜出炉 整个过程接近30分钟,感觉好快. 感觉面试官GG挺好人的,挺好说话的:是一对一面的.刚进去,他那里已有打印的简历(之前网申的简历,不是彩印的),我说自己带简历,是彩印的比较好点. 一开始,还是自我介绍:我没有全部发挥,只是简简单单介绍了下,1分钟多一点(平时都是两三分钟吧).接着,他看下简历,让我介绍一个我认为学得到比较多东西的项目(一般搞技术的不外乎都要将项目的,当然,也有例外).我挑简历中的第一个项目来说.讲完之后,面试官开始提问. 关于数据库缓存

微信小程序开发视频教程新鲜出炉

微信小程序开发公测了,可是对于新手来说,不同的框架不同的开发机制,如何快速适应呢?微信小程序开发视频教程新鲜出炉了,从零开始一步一步搭建微信小程序,每个章节都会涉及到不同的知识点,等教程学习完你不但掌握了小程序开发全部知识,同时还拥有一个完整作品的开发经验! 有需要的朋友关注一下ytkah的微信,留言索取微信小程序开发视频教程!

我们常见的胶带是怎么新鲜出炉的?

我们常见的胶带是怎么新鲜出炉的? 胶带在我们生活中扮演着很重要的角色,我们许多地方都离不开胶带的帮助,由于胶带厂家鱼龙混杂,那质量好的胶带是怎么生产的? 其实胶带工厂生产胶带原理是在BOPP原膜上高压电晕在相对粗糙的一面涂上胶水,胶带工厂机械把胶带分成小卷,是我们常用卷状胶带.而胶带涂的胶水是一种特殊的丙烯酸脂胶水,别名叫压敏胶.他的强度直接影响胶带质量,胶水厚度22微米是标准厚度. 透明胶带做法: 一 分切机把母卷加工. 二 opp薄膜及水性压敏胶用涂布机涂胶加工 辅料 纸管 纸箱 箭头标等等

感恩回馈,新鲜出炉的《ASP.NET MVC 5框架揭秘》免费赠送

上次针对<ASP.NET Web API 2框架揭秘>举办了一次评论赠书活动,很多人问我相同的活动要不要针对<ASP.NET MVC 5框架揭秘>(阅读样章)再来一次,为此我向出版社要了10本,其中5本以评论博客的形式送出,另5本则以转发微博的形式送出,详细规则如下. 活动1 8月18.19.20.21.22(周一到周五)总计5天,在本帖,每天14点的第一个回帖评论者,分别赠送<ASP.NET MVC 5框架揭秘>1本.同一ID不可以重复参与活动,重复的话,取紧接着的下

TWaver MONO模板库新鲜出炉 精彩纷呈

MONO Design在线3D建模平台网站, www.mono-design.cn,开发组的成员们已经开始紧锣密鼓的对这个平台进行内测.在之前的文章里,我们提到用户可以获得多种多样的TWaver官方模型库, 现在已经新鲜出炉,让我们擦亮眼睛,一睹为快! 模板图库闪耀登场…TWaver MONO Design模板库中,各式各样的办公桌.椅子等,快速拖拽,创意摆放,分分钟创建办公室工作场景.下面是办公室必备款,会议桌.桌子.椅子.书柜及文件柜走起. 桌子:图锦单图秀场 椅子沙发:图锦 单图秀场 书柜