HTML5+Springmvc实现拖拽文件上传

关于这个拖拽上传,其实国外有很多网站已经有这样的应用,最早推出拖拽上传应用的是 Gmail,它支持标准浏览器下拖拽本地文件到浏览器中作为邮件的附件发送,但其实现在利用HTML5的功能实现,主要借助于新版支持的浏览器来实现,IE还是弱很多

看到一段话是这样说的:你敢"脱",我就敢传


拖拽上传应用主要使用了以下 HTML5技术:

Drag&Drop:

HTML5基于拖拽的事件机制.

File API:

可以很方便的让 Web 应用访问文件对象,File API包括FileList、Blob、File、FileReader、URI scheme,本文主要讲解拖拽上传中用到的 FileList 和 FileReader 接口。

FormData:

FormData 是基于XMLHttpRequest Level 2的新接口,可以方便 web 应用模拟 Form 表单数据,最重要的是它支持文件的二进制流数据,这样我们就能够通过它来实现 AJAX 向后端发送文件数据了。


HTML5Drag & Drop 事件

过去我们想实现网页中的拖拽效果,基本上都是使用DOM事件模型中的mousedown、mousemove、mouseup的事件监听来模拟拖拽效果,为了实现实时的拖拽移动效果,还要不停地获取鼠标的坐标,还要不停的修改元素的位置,代码要堆很多,而且性能上也很不好(不停地修改元素位置会导致页面reflow,除非绝对定位),现在有了html5原生的Drag & Drop 拖拽事件,真的是方便了许多,用”事半功倍”来形容绝不为过。


Drag & Drop 包括以下事件:

dragstart:要被拖拽的元素开始拖拽时触发,这个事件对象是被拖拽元素

dragenter:拖拽元素进入目标元素时触发,这个事件对象是目标元素

dragover:拖拽某元素在目标元素上移动时触发,这个事件对象是目标元素

dragleave:拖拽某元素离开目标元素时触发,这个事件对象是目标元素

dragend:在drop之后触发,就是拖拽完毕时触发,这个事件对象是被拖拽元素

drop:将被拖拽元素放在目标元素内时触发,这个事件对象是目标元素 完成一次成功页面元素拖拽的行为事件过程: dragstart –> dragenter –> dragover –> drop –> dragend

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//要想实现拖拽,首页需要阻止浏览器默认行为,一共四个事件。
$(document).on({
     dragleave:function(e){  //拖离
         e.preventDefault();
         $('.dashboard_target_box').removeClass('over');
     },
     drop:function(e){       //拖后放
         e.preventDefault();
     },
     dragenter:function(e){  //拖进
         e.preventDefault();
         $('.dashboard_target_box').addClass('over');
     },
     dragover:function(e){   //拖来拖去
         e.preventDefault();
         $('.dashboard_target_box').addClass('over');
     }
});


获取文件数据HTML5File API

File API 中的 FileList 接口,它主要通过两个途径获取本地文件列表:

一种是 <input type="file">的表单形式,

一种是 e.dataTransfer.files拖拽事件传递的文件信息

1
var fileList = e.dataTransfer.files;

使用files 方法将会获取到拖拽文件的数组形势的数据,每个文件占用一个数组的索引,如果该索引不存在文件数据,将返回 null 值。可以通过length属性获取文件数量.

1
var fileNum = fileList.length;

文件类型

1
fileList[ 0 ].type.indexOf (’image’)


AJAX 上传图片(file.getAsBinaryFormData)

file.getAsBinary获取文件流很简单,但是要想上传数据,就要模拟一下表单的数据格式了,首先看看模拟表单的 js 代码, FormData模拟表单数据时更是简洁,不用麻烦的去拼字符串,而是直接将数据 append 到 formdata 对象中即可

1
2
3
4
5
6
7
8
xhr = new XMLHttpRequest();
xhr.open("post", "test.php", true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
  
var fd = new FormData();
fd.append('ff', fileList[0]);
  
xhr.send(fd);


HTML5+Springmvc实现拖拽文件上传实例

完整源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<!DOCTYPE HTML>
< html >
< head >
< meta  charset = "utf-8" >
< title >HTML5拖拽文件上传</ title >
< style >
.dashboard_target_box {
     width: 250px;
     height: 105px;
     border: 3px dashed #E5E5E5;
     text-align: center;
     position: absolute;
     z-index: 2000;
     top: 0;
     left: 0;
     cursor: pointer
}
  
.dashboard_target_box.over {
     border: 3px dashed #000;
     background: #ffa
}
  
.dashboard_target_messages_container {
     display: inline-block;
     margin: 12px 0 0;
     position: relative;
     text-align: center;
     height: 44px;
     overflow: hidden;
     z-index: 2000
}
  
.dashboard_target_box_message {
     position: relative;
     margin: 4px auto;
     font: 15px/18px helvetica, arial, sans-serif;
     font-size: 15px;
     color: #999;
     font-weight: normal;
     width: 150px;
     line-height: 20px
}
  
.dashboard_target_box.over #dtb-msg1 {
     color: #000;
     font-weight: bold
}
  
.dashboard_target_box.over #dtb-msg3 {
     color: #ffa;
     border-color: #ffa
}
  
#dtb-msg2 {
     color: orange
}
  
#dtb-msg3 {
     display: block;
     border-top: 1px #EEE dotted;
     padding: 8px 24px
}
</ style >
< script >
     $(document).ready(function() {
         //设计一段比较流行的滑动样式
         $('#drop_zone_home').hover(function() {
             $(this).children('p').stop().animate({
                 top : '0px'
             }, 200);
         }, function() {
             $(this).children('p').stop().animate({
                 top : '-44px'
             }, 200);
         });
  
         //要想实现拖拽,首页需要阻止浏览器默认行为,一个四个事件。
         $(document).on({
             dragleave : function(e) { //拖离
                 e.preventDefault();
                 $('.dashboard_target_box').removeClass('over');
             },
             drop : function(e) { //拖后放
                 e.preventDefault();
             },
             dragenter : function(e) { //拖进
                 e.preventDefault();
                 $('.dashboard_target_box').addClass('over');
             },
             dragover : function(e) { //拖来拖去
                 e.preventDefault();
                 $('.dashboard_target_box').addClass('over');
             }
         });
  
         //================上传的实现
         var box = document.getElementById('target_box'); //获得到框体
         box.addEventListener("drop", function(e) {
             e.preventDefault(); //取消默认浏览器拖拽效果
          
             var fileList = e.dataTransfer.files; //获取文件对象
             //fileList.length 用来获取文件的长度(其实是获得文件数量)
             //检测是否是拖拽文件到页面的操作
             if (fileList.length == 0) {
                 $('.dashboard_target_box').removeClass('over');
                 return;
             }
             //检测文件是不是图片
             /*if (fileList[0].type.indexOf('image') === -1) {
                 $('.dashboard_target_box').removeClass('over');
                 return;
             }*/
  
             //var img = window.webkitURL.createObjectURL(fileList[0]);
             //拖拉图片到浏览器,可以实现预览功能
             xhr = new XMLHttpRequest();
             xhr.open("post", "/upload", true);
             xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
  
             var fd = new FormData();
             fd.append('files', fileList[0]);
  
             xhr.send(fd);
         }, false);
     });
</ script >
</ head >
  
< body >
     < div  id = "target_box"  class = "dashboard_target_box" >
         < div  id = "drop_zone_home" class = "dashboard_target_messages_container" >
             < p  id = "dtb-msg2"  class = "dashboard_target_box_message"
                 style = "top: -44px" >
                 选择你的图片< br > 开始上传
             </ p >
             < p  id = "dtb-msg1"  class = "dashboard_target_box_message"
                 style = "top: -44px" >
                 拖动图片到< br > 这里
             </ p >
         </ div >
     </ div >
</ body >
</ html >

springmvc上传的配置

1
2
3
4
< bean  id = "multipartResolver"
class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" >
     < property  name = "maxUploadSize"  value = "5000000" ></ property >
</ bean >

控制类

1
2
3
4
5
6
7
8
9
@RequestMapping (value= "/upload" ,method=RequestMethod.POST)
public  void  upload( @RequestParam  MultipartFile[] files,
       HttpServletRequest request){
     for (MultipartFile file:files) {
         if (file.isEmpty())  continue ;
         System.out.println(file.getContentType()+ "," +
                   file.getName()+ "," +file.getOriginalFilename());
     }
}

效果图:


后台输出:image/jpeg,files,DSC03856.JPG


本文链接:HTML5+Springmvc实现拖拽文件上传,由领悟书生原创

转载请注明出处【http://www.656463.com/article/338】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值