拖拽上傳檔案的web客戶端實現
阿新 • • 發佈:2018-12-23
1. html 程式碼
準備一個jquery.js
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<style>
#drag-frame {
width: 500px;
height: 400px;
border: dashed 4px gray;
border-radius : 10px;
}
</style>
<script src="js/jquery.js"></script>
<script src="js/drag.js"></script>
<body>
<div id="drag-frame" class="drag-frame">
<table class="table">
<tbody class="tbody"></tbody>
</table>
</div>
<input type="button" id="clear" value="清空" />
</body>
</html>
2. js程式碼
$(() => {
//新增拖拽事件
var dz = document.getElementById('drag-frame');
dz.ondragover = function(ev) {
//阻止瀏覽器預設開啟檔案的操作
ev.preventDefault();
// 拖入檔案後邊框顏色變紅
this.style.borderColor = 'red';
}
dz.ondragleave = function() {
//恢復邊框顏色
this.style.borderColor = 'gray';
}
dz.ondrop = function(ev) {
ev.preventDefault();
//恢復邊框顏色
this.style.borderColor = 'gray';
//阻止瀏覽器預設開啟檔案的操作
var drag_files = ev.dataTransfer.files;
var frag = document.createDocumentFragment(); //為了減少js修改dom樹的頻度,先建立一個fragment,然後在fragment裡操作
var tr, time, size;
for(var file of drag_files) {
tr = document.createElement('tr');
//獲取檔案大小
size = Math.round(file.size * 100 / 1024) / 100 + 'KB';
//獲取格式化的修改時間
time = file.lastModifiedDate.toLocaleDateString() + ' ' + file.lastModifiedDate.toTimeString().split(' ')[0];
tr.innerHTML = '<td>' + file.name + '</td><td>' + time + '</td><td>' + size + '</td><td>刪除</td>';
console.log(size + ' ' + time);
frag.appendChild(tr); //?
dragFiles.set(file.name,file);
}
this.childNodes[1].childNodes[1].appendChild(frag);
//為什麼是‘1'?文件裡幾乎每一樣東西都是一個節點,甚至連空格和換行符都會被解釋成節點。而且都包含在childNodes屬性所返回的陣列中.不同於jade模板
}
// 用事件委託的方法為‘刪除'新增點選事件,使用jquery中的on方法
$(".tbody").on('click', 'tr td:last-child', function() {
//刪除拖拽框已有的檔案
var key = $(this).prev().prev().prev().text();
console.log(key);
dragFiles.delete(key)
$(this).parent().remove();
});
$("#clear").click(clearAll);
});
// 使用map的好處是可以去重
let dragFiles = new Map();
//清空所有內容
function clearAll() {
$("#drag-frame tbody").html('');
dragFiles.clear();
}
/**
* 獲取FormData物件
*/
function getFormData() {
var formDate = new FormData();
dragFiles.forEach(function(item) {
formDate.append("files",item);
})
return formDate;
}
3. 效果如圖
4. 上傳
使用getFormData()獲取 FormData 物件後,剩下的操作可以參照 springMVC檔案上傳