HTML5文件实现拖拽上传
来源:互联网 发布:阿里云200m无限流量 编辑:程序博客网 时间:2024/06/05 19:24
转自:http://www.cnblogs.com/caonidayecnblogs/archive/2010/09/09/1821925.html
通过HTML的文件API ,Firefox、Chrome等浏览器已经支持从操作系统直接拖拽文件,并上传到服务器。
相对于使用了十多年的HTML表单,这是一个革命性的进步。虽然IE的落后让很多开发者还在观望中,但是Gmail邮箱的附件拖拽功能已经给部分用户带来了极大的方便,而需要大量上传文件的CMS(内容管理系统)也将会从中受益。
让我们看一下Firefox 是如何使用拖拽上传功能的:
首先提供一个区域来放置文件
Html代码
1
<div name=
"image"
id=
"dropbox"
style=
"min-width:300px;min-height:100px;border:3px dashed silver;"
></div>
然后监听拖拽过程中的dragenter、dragleave、drop等事件
Js代码
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
document.addEventListener(
"dragenter"
,
function
(e){
dropbox.style.borderColor =
'gray'
;
},
false
);
document.addEventListener(
"dragleave"
,
function
(e){
dropbox.style.borderColor =
'silver'
;
},
false
);
dropbox.addEventListener(
"dragenter"
,
function
(e){
dropbox.style.borderColor =
'gray'
;
dropbox.style.backgroundColor =
'white'
;
},
false
);
dropbox.addEventListener(
"dragleave"
,
function
(e){
dropbox.style.backgroundColor =
'transparent'
;
},
false
);
dropbox.addEventListener(
"dragenter"
,
function
(e){
e.stopPropagation();
e.preventDefault();
},
false
);
dropbox.addEventListener(
"dragover"
,
function
(e){
e.stopPropagation();
e.preventDefault();
},
false
);
dropbox.addEventListener(
"drop"
,
function
(e){
e.stopPropagation();
e.preventDefault();
handleFiles(e.dataTransfer.files);
submit.disabled =
false
;
},
false
);
其中最主要的是drop事件中用handleFiles()依次处理所有文件
1
2
3
4
5
6
handleFiles =
function
(files) {
for
(
var
i = 0; i < files.length; i++) {
var
file = files[i];
}
}
对于图片类型的文件可以直接读取内容,显示预览图
1
2
3
4
5
6
7
8
9
10
11
12
if
(!file.type.match(/image*/)) {
continue
;
}
var
img = document.createElement(
"img"
);
img.classList.add(
"obj"
);
img.file = file;
preview.appendChild(img);
var
reader =
new
FileReader();
reader.onload = (
function
(aImg) {
return
function
(e) { aImg.src = e.target.result; }; })(img);
reader.readAsDataURL(file);
接下来就是核心功能:ajax上传。首先新建一个XHR请求
1
2
var
xhr =
new
XMLHttpRequest();
xhr.open(
'post'
,
'/file/upload'
,
true
);
监听上传进度和完成事件
1
2
3
4
5
6
7
8
9
10
xhr.upload.addEventListener(
"progress"
,
function
(e) {
if
(e.lengthComputable) {
var
percentage = Math.round((e.loaded * 100) / e.total);
img.style.opacity = 1-percentage/100.0;
}
},
false
);
xhr.upload.addEventListener(
"load"
,
function
(e){
},
false
);
最后把数据模拟成multipart/form-data的格式上传
1
2
3
4
5
6
7
8
9
10
11
xhr.setRequestHeader(
"Content-Type"
,
"multipart/form-data, boundary="
+boundary);
// simulate a file MIME POST request.
xhr.setRequestHeader(
"Content-Length"
, fileSize);
var
body =
''
;
body +=
"--"
+ boundary +
"\r\n"
;
body +=
"Content-Disposition: form-data; name=\""
+dropbox.getAttribute(
'name'
)+
"\"; filename=\""
+ fileName +
"\"\r\n"
;
body +=
"Content-Type: "
+fileType+
"\r\n\r\n"
;
body += fileData +
"\r\n"
;
body +=
"--"
+ boundary +
"--\r\n"
;
xhr.sendAsBinary(body);
0 0
- HTML5文件实现拖拽上传
- html5实现拖拽文件上传
- HTML5+Springmvc实现拖拽文件上传
- HTML5文件实现拖拽上传
- html5实现拖拽文件上传
- HTML5文件实现拖拽上传
- HTML5+Springmvc实现拖拽文件上传
- HTML5文件实现拖拽上传
- HTML5+Springmvc实现拖拽文件上传
- HTML5文件实现拖拽上传
- HTML5文件实现拖拽上传
- HTML5 拖拽以及实现拖拽异步上传文件
- HTML5文件拖拽上传
- html5实现多文件上传
- HTML5开发 拖拽文件上传
- HTML5应用之文件拖拽上传
- html5之多文件拖拽上传预览
- spring html5 拖拽上传多文件
- git使用详细介绍
- Lucene
- jira找到字段的ID
- 修改linux打开文件最大数与最大线程数
- iOS之类别(category)在静态库中不能使用的问题
- HTML5文件实现拖拽上传
- OC clang -rewrite-objc 详解
- cron表达式详解
- doc在线预览的效果/java
- Android 看到什么写什么——ECTranslation
- JavaScript中的包装对象
- DateUtils工具类
- 【bzoj2104】 K-th Number
- 可以播放gif格式的imageView,在大神基础上增强了一些