我有一個HTML表單,其中包含一個文件輸入字段與多個文件選擇,我也有一個拖放功能,我也在工作。我的問題是如果甚至有可能無縫地集成這兩個功能?HTML5拖放和多個文件上傳
理想情況下,我希望用戶通過拖放或通過文件對話框選擇他們的文件。用戶完成選擇文件後,點擊表單提交按鈕上傳。
我想我的主要不確定性是如何綁定被拖放到文件輸入字段的表單提交的文件。
我有一個HTML表單,其中包含一個文件輸入字段與多個文件選擇,我也有一個拖放功能,我也在工作。我的問題是如果甚至有可能無縫地集成這兩個功能?HTML5拖放和多個文件上傳
理想情況下,我希望用戶通過拖放或通過文件對話框選擇他們的文件。用戶完成選擇文件後,點擊表單提交按鈕上傳。
我想我的主要不確定性是如何綁定被拖放到文件輸入字段的表單提交的文件。
我寫了一些jQuery代碼來做到這一點,告訴我它是否適合你。
<!DOCTYPE html>
<html>
<head>
<title>Multiple DnD Uploader</title>
<link rel="stylesheet" href="style.css" />
<script type = "text/javascript" src = "../music/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('#drop').change(function(event){
files = event.target.files;
$('#drop').css('display', 'none');
for(var i = 0, len = files.length; i < len; i++) {
if((files[i].fileName+"").substring((files[i].fileName+"").length-4,(files[i].fileName+"").length)=='.mp3'){
$.ajax({
type: "POST",
url: "uploader.php?id="+i,
contentType: "multipart/form-data",
headers: {
"X-File-Name" : files[i].fileName,
"X-File-Size" : files[i].fileSize,
"X-File-Type" : files[i].type
},
beforeSend: function() {
$('#info').append('<li class="indicator"><span class="label">File Name :</span> '+files[i].fileName+' | <span class="label">Size :</span> ' + files[i].fileSize + ' | <img id="'+i+'" src="loading.gif" /></li>');
},
processData: false,
data: files[i],
success: function(data){
$('#'+data).attr('src', 'check.png');
},error: function(data){
$('#info').append('Error: ' + data + '<br />');
}
});
}else{
$('#info').append('Error: Incorrect file type. Looking for .mp3');
}
}
});
});
</script>
</head>
<body>
<div id="drop">
<h1>Drop files here</h1>
<p>To add them as attachments</p>
<input type="file" multiple="true" id="filesUpload" />
</div>
<div id="info">
</div>
</body>
</html>
而且PHP文件看起來像這樣:
<?php
$headers = array();
foreach ($_SERVER as $k => $v){
if(substr($k, 0, 5) == "HTTP_"){
$k = str_replace('_', ' ', substr($k, 5));
$k = str_replace(' ', '-', ucwords(strtolower($k)));
$headers[$k] = $v;
}
}
$file = new stdClass;
$file->name = basename($headers['X-File-Name']);
$file->size = $headers['X-File-Size'];
$file->content = file_get_contents("php://input");
if(file_put_contents('files/'.$file->name, $file->content))
echo $_GET['id'];
?>
我不完全知道你是如何做的,所以我會告訴你,我做的方式,然後嘗試回答你的問題。
filesUpload.addEventListener("change", function() {traverseFiles(this.files);}, false);
dropArea.addEventListener("drop", function (evt) {traverseFiles(evt.dataTransfer.files);}, false);
traverseFiles
您在上面看到的是,得到一個FileList
(一個的File
列數組)的函數,其是File API的一部分。該功能然後爲每個File
調用功能uploadFile
。通過ajax(XMLHttpRequest.send(file)
)異步發送File
。現在回答你的問題如何將丟棄的文件綁定到輸入字段:你不這樣做,你只是做它的其他方式。您創建一個用於上傳文件的API或包裝器,然後如果用戶丟棄文件,則調用該包裝函數。如果用戶點擊<輸入>字段,則再次調用該包裝(就像我對traverseFiles所做的那樣)。
有意義嗎?如果沒有,告訴我哪個部分,我會編輯這個答案/展開它。
你可以使用「HTML5的文件,上傳」,它聲稱做你的需要,以及優雅降級爲舊版瀏覽器:
https://github.com/gre/HTML5-File-Uploader/wiki
我還沒有嘗試過自己。
或者,你可以看看這個頁面,它提供所有你需要做自己的代碼:
<input type=file multiple>
<div id='dropzone'>Drop Files Here</div>
平變化和ondrop事件shuld功能綁定變量獲取文件列表。
var files=e.target.files||e.dataTransfer.files
在那裏你能完成這項工作? – 2017-11-07 00:43:02