文件拖拽上传

1. 文件拖拽


不多说了,看代码和注释。貌似 Chrome 和 Firefix 都支持的。


    var dragOver = function (event) {
// 阻止默认事件
event.stopPropagation();
event.preventDefault();

// 修改样式
this.className = “xx-over”;
};

var dragLeave = function (event) {
event.stopPropagation();
event.preventDefault();
this.className = “xx”;
};

var drop = function (event) {
event.stopPropagation();
event.preventDefault();

this.className = “xx”;
var files = event.dataTransfer.files;
for (var i = 0; i < files.length; i++) {
// 可在此对文件进行大小和类型的限制
files[i].type
files[i].size

// 正式上传
uploadFile(files[i]);
}
};

// 把文件拖拽于 content 容器上,监听拖拽中、拖拽结束、拖拽离开的事件
var content = document.getElementById(“XXX”);
content.addEventListener(“dragover”, dragOver, false);
content.addEventListener(“dragleave”, dragLeave, false);
content.addEventListener(“drop”, drop, false);


2. 文件上传
    基础知识准备



  •     XMLHttpRequest 请求


var request = new XMLHttpRequest();
request.open(‘GET’, ‘file:///home/user/file.json’, false);
request.send(null);

open 参数说明


@param {string} 请求方式: GET, POST, PUT, DELETE


@param {string} 请求地址。注:可以是本地文件哦。


@param {boolean} 同步: false; 异步: true


其余常用属性,在此就不解释,解释也只是翻译而已 ^^


request.onreadystatechange
request.readyState
request.responseText
request.statusText
request.statuse



  • FormData Object


var formElement = document.getElementById(“formId”);
// 如果没有 form 元素,可以不用传入该参数
var formData = new FormData(formElement);
formData.append(“name”, nameValue);

request.send(formData);


  • 上传进度


    var req = new XMLHttpRequest();

req.addEventListener(“progress”, updateProgress, false);

req.open();



// progress on transfers from the server to the client (downloads)
function updateProgress(evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;

} else {
// Unable to compute progress information since the total size is unknown
}
}


    实现


var uploadFile = function(file) {
var loadEnd = function() {
content.className = “bg loading”;
var request = new XMLHttpRequest();
request.open(‘POST’, “actionURL”, true);

var formData = new FormData();
formData.append(‘upload’,file);
request.send(formData);

request.onload = function () {
content.className = “bg”;
};

request.onprogress = function (evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
} else {
// Unable to compute progress information since the total size is unknown
}
}
};

var reader = new FileReader();
// Firefox 3.6, WebKit
if(reader.addEventListener) {
reader.addEventListener(‘loadend’, loadEnd, false);
} else {
reader.onloadend = loadEnd;
}
reader.readAsBinaryString(file);
};