JSFiddle - React, Tailwind, and code Playground
HTML
<div id="dnd">DROP!</div>
<input id="dirinput" multiple="" directory="" type="file" />
<br/><br/>
<div id="output"></div>
CSS
#dnd {
border:10px solid black;
text-align:center;
padding:10px;
width:400px;
height:100px;
margin:auto;
font-size:40px;
display:inline-block;
}
#output {
background-color:#FFFACD;/*FFFFCC*/
}
JavaScript
var dnd = document.getElementById("dnd");
dnd.ondragover = function(e) {e.preventDefault()}
dnd.ondrop = function(e) {
e.preventDefault();
var transfer = e.dataTransfer;
if(transfer.getFilesAndDirectories){
handleFirefoxUpload(transfer);
}
}
function handleFirefoxUpload(transfer){
var promise = transfer.getFilesAndDirectories();
promise.then(function(files){
log("dropped items: " + files.length);
for (var i=0, arrSize=files.length; i < arrSize; i++) {
var file = files[i];
iterateFilesAndDirs(file);
}
})
}
function log(msg){
var infoField = document.getElementById("output");
infoField.innerHTML += "<br/>";
infoField.innerHTML += msg;
}
function iterateFilesAndDirs(file){
if (file instanceof Directory) {
var promise = file.getFilesAndDirectories()
promise.then(function(subfiles){
for (var i=0, arrSize=subfiles.length; i < arrSize; i++) {
var subfile = subfiles[i];
iterateFilesAndDirs(subfile);
}
})
}
else if (file instanceof File){
upload(file);
}
else {
console.log("unknown file type: " + (typeof file));
}
}
function upload(file) {
log("uploading file=" + file.name + ", size=" + file.size);
}
var dirinput = document.getElementById("dirinput");
dirinput.addEventListener("change", function (e) {
if ('getFilesAndDirectories' in this) {
this.getFilesAndDirectories().then(function(filesAndDirs) {
for (var i=0, arrSize=filesAndDirs.length; i < arrSize; i++) {
iterateFilesAndDirs(filesAndDirs[i]);
}
});
}
else {
var files = e.target.files;
for (var i=0, arrSize=files.length; i < arrSize; i++) {
upload(files[i]);
}
}
}, false);