1. 程式人生 > >拖拽上傳檔案的web客戶端實現

拖拽上傳檔案的web客戶端實現

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檔案上傳