program:javascript:html5_uploadfile_drag_drop
目前測試:
Firefox, Chrome, Safari – OK
Android, iOS – 部分問題
IE – Fail
<!DOCTYPE html> <html> <head> <title>Upload Files using XMLHttpRequest - Minimal</title> <style > .file_items { border-top:1px solid #CCC; border-left:1px solid #CCC; border-right:1px solid #CCC; } .progress_bar { position:relative; height:20px; border-bottom:1px solid #CCC; background-color: #EEE; } .progress_ui { position:relative; height:20px; width:0%; background-color:#DDD; } .progress_label { position:absolute; top:0px; width:100%; font-size:11px; padding-top:3px; padding-left:3px; } </style> <script type="text/javascript"> var _FilePath = "/tmp/up"; var _FileArray = new Array(); var _FileIndex = -1; // 初始化 function init(){ alert("window.File="+window.File); //可以用來存取硬碟中的檔案 alert("window.Blob="+window.Blob); //表示儲存在檔案中的原生資料 alert("window.FileList="+window.FileList); //File物件所成的集合 alert("window.FileReader="+window.FileReader); //用來讀取檔案 //設定可 Drag & Drop 的區域 var dropArea = document.getElementById("drop_area"); dropArea.addEventListener('dragover', handleDragOver, false); //拖拉物件經過 dropArea.addEventListener('dragleave', handleDragLeave, false); //拖拉物件離開 dropArea.addEventListener('drop', handleDropDown, false); //拖拉物件放下 } //拖拉物件經過 function handleDragOver(evt){ evt.stopPropagation(); evt.preventDefault(); document.getElementById("drop_area").style.backgroundColor="#BBB"; } //拖拉物件離開 function handleDragLeave(evt){ evt.stopPropagation(); evt.preventDefault(); document.getElementById("drop_area").style.backgroundColor="#EEE"; } //拖拉物件放下 function handleDropDown(evt){ evt.stopPropagation(); evt.preventDefault(); files = evt.dataTransfer.files; //取得物件的檔案資訊 fileSelected(files); //將檔案加入列表 document.getElementById("drop_area").style.backgroundColor="#EEE"; } /* * 將檔案加入列表 * _File: 檔案物件列表 */ function fileSelected(_Files) { for(i=0;i<_Files.length;i++){ var file = _Files[i]; if (file) { _FileArray.push(file); //將檔案加入 File Array var index = _FileArray.length -1; //取得目前檔案的位置 // Size 格式化 四捨五入到小數第一位 var size2=""; if(file.size > (1024*1024*1024)) size2 = (file.size/(1024*1024*1024)).toFixed(1) +" GB"; else if(file.size > (1024*1024)) size2 = (file.size/(1024*1024)).toFixed(1)+ " MB"; else if(file.size > 1024) size2 = (file.size/1024).toFixed(1) + " KB"; else size2 = file.size + " B"; //建立視覺化的檔案列表 var file_items = document.getElementById("file_items"); var file_item = document.createElement("div"); file_item.setAttribute("id","file_item_" + index); file_items.appendChild(file_item); var file_item_content = ""; file_item_content += ""; file_item_content += "<div class='progress_bar'>"; file_item_content += "<div class='progress_ui'></div>"; file_item_content += "<span class='progress_label'>"+file.name+" - "+size2+"</span>"; file_item_content += "</div>"; file_item.innerHTML = file_item_content; } } } //上傳 FileArray 內的檔案 function uploadFiles(){ if(_FileIndex < _FileArray.length -1 ){ _FileIndex++; upFile(); } } //開始上傳檔案 function upFile() { var file = _FileArray[_FileIndex]; //設定表單內容 var fd = new FormData(); fd.append("filepath", _FilePath); //Server 的寫入位置(請參考uploadFile.cgi格式) fd.append("filesize", file.size); //檔案大小(請參考uploadFile.cgi格式) fd.append("file", file); //欲上傳的檔案 var xhr = new XMLHttpRequest(); xhr.upload.addEventListener("progress", uploadProgress, false); //加入監聽 - Progress 改變 xhr.addEventListener("load", uploadComplete, false); //加入監聽 - 上傳完成 xhr.addEventListener("error", uploadFailed, false); //加入監聽 - 上傳失敗 xhr.addEventListener("abort", uploadCanceled, false); //加入監聽 - 上傳取消 xhr.open("POST", "/cgi-bin/uploadFile.cgi"); //非同步上傳 xhr.send(fd); } //上傳檔案 - Progress 改變 function uploadProgress(evt) { if (evt.lengthComputable) { var percentComplete = Math.round(evt.loaded * 100 / evt.total); //document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%'; var _file_item = document.getElementById("file_item_"+_FileIndex); var _progress_label = _file_item.getElementsByClassName("progress_label").item(0); var _progress_bar = _file_item.getElementsByClassName("progress_bar").item(0); var _progress_ui = _progress_bar.getElementsByClassName("progress_ui").item(0); _progress_ui.style.width = percentComplete.toString() + '%'; //_progress_label.innerHTML = percentComplete.toString() + '%'; } else { //document.getElementById('progressNumber').innerHTML = 'unable to compute'; } } //上傳檔案 - 上傳完成 function uploadComplete(evt) { /* This event is raised when the server send back a response */ var _file_item = document.getElementById("file_item_"+_FileIndex); var _progress_bar = _file_item.getElementsByClassName("progress_bar").item(0); var _progress_ui = _progress_bar.getElementsByClassName("progress_ui").item(0); _progress_ui.style.width = '100%'; //alert(evt.target.responseText); setLabel("Finish") uploadFiles(); } //上傳檔案 - 上傳失敗 function uploadFailed(evt) { //alert("There was an error attempting to upload the file."); setLabel("Error"); uploadFiles(); } //上傳檔案 - 上傳取消 function uploadCanceled(evt) { //alert("The upload has been canceled by the user or the browser dropped the connection."); setLabel("Calcle"); uploadFiles(); } //使用隱藏的 Input-File 選擇檔案 function openFileMessage(){ //document.getElementById("FileSelect").style.display="block"; document.getElementById("FileSelect").click(); //document.getElementById("FileSelect").style.display="none"; } //設定檔案列表的檔案資訊 function setLabel(str){ var _file_item = document.getElementById("file_item_"+_FileIndex); var _progress_label = _file_item.getElementsByClassName("progress_label").item(0); _progress_label.innerHTML += " - "+str; } </script> </head> <body onLoad="init();"> <div id="drop_area" style="width:450px; background-color:#EEE"> <label>Please select files or drag and drop files to here</label><br /> <input type="button" onClick="openFileMessage();" value="Select Files"> <input type="file" name="file" id="FileSelect" onchange="fileSelected(this.files);" multiple style="display:none"/> <div id="file_items" class='file_items'></div> <input type="button" onclick="uploadFiles()" value="Upload"/> </div> </body> </html>
program/javascript/html5_uploadfile_drag_drop.txt · 上一次變更: 2019/11/16 08:12 由 127.0.0.1