这个怎么样?
该解决方案使用 HTML、jQuery/Javascript 和 PHP(用于服务器端处理此数据)。想法是: 1.) HTML 表单:包括一个“浏览”按钮,允许用户选择多个文件(在一个目录中)。 2.) jQuery:在表单中创建一个新按钮的选项,允许用户选择多个文件(在不同的目录中——甚至实际上是同一个目录!),具有“无限”创建新按钮的能力。 3.) PHP:作为奖励,我考虑了将数据很好地打包以供服务器端处理。
这是 HTML 表单的外观(我使用了一个可点击对象的找到图标,但您可以轻松地将其替换为您选择的图形)。
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype='multipart/form-data'>
Select files: <br/>
<input type='file' name='files0[]' id="files0" multiple><br/><br/><br/>
<span style="font-size: 10pt;">Click "+" for more files
<i id="more_files" class="general foundicon-plus" style="color: blue;cursor: pointer;"></i></span>
<br/><br/><br/>
<input type="submit" name="submit" value="Submit">
</form>
这是 jQuery/Javascript 在事件触发后创建一个新的“浏览”按钮(这甚至将它放在最后一个“浏览”按钮之后!):
<script type="text/javascript">
//jQuery
$(document).ready(function() {
$(document).on('click','#more_files', function() {
var numOfInputs = 1;
while($('#files'+numOfInputs).length) { numOfInputs++; }//once this loop breaks, numOfInputs is greater than the # of browse buttons
$("<input type='file' multiple/>")
.attr("id", "files"+numOfInputs)
.attr("name", "files"+numOfInputs+"[]")
.insertAfter("#files"+(numOfInputs-1));
$("<br/>").insertBefore("#files"+numOfInputs);
});
});
</script>
<script>
//vanilla javascript version
var location = document.getElementById("fileBrowsers");
var br = document.createElement("BR");
location.appendChild(br);
var input = document.createElement("input");
input.type = "file";
input.name = "files"+numOfInputs+"[]";
input.id = "files"+numOfInputs;
input.multiple = true;
location.appendChild(input);
</script>
最后,可能也是最重要的一点,如何以熟悉的格式包装服务器上的数据:
<?php
if(isset($_POST['submit']) && !empty($_FILES)) {
$files = array();
$files = $_FILES['files0'];
//var_dump($files);//this array will match the structure of $_FILES['browser']
//Iterate through each browser button
$browserIterator = 1;
while(isset($_FILES['files'.$browserIterator])) {
//Files have same attribute structure, so grab each attribute and append data for each attribute from each file
foreach($_FILES['files'.$browserIterator] as $attr => $values) {//get each attribute
foreach($_FILES['files'.$browserIterator][$attr] as $fileValue) {//get each value from attribute
$files[$attr][] = $fileValue;//append value
}
}
$browserIterator++;
}
//Use $files like you would use $_FILES['browser'] -- It is as though all files came from one browser button!
$fileIterator = 0;
while($fileIterator < count($files['name'])) {
echo $files['name'][$fileIterator]."<br/>";
$fileIterator++;
}
}
?>
更新说明: jQuery 脚本和 vanilla Javascript 实现相同的目标。我遇到了一个需要香草版本的问题。 您只需要其中一个。