My question would be is there any workaround for latest stable Firefox
version to detect directories? Because on stable version that feature
is disabled by default or do I miss something?
Directory upload was not enabled by default at firefox 47, where tried html
, javascript
at stacksnippets, jsfiddle.
See Firefox 42 for developers Interfaces/APIs/DOM
The Directory
interface has been experimentally extended (bug
1177688). The two members Directory.path
and
Directory.getContents
can be exposed by setting the
dom.input.dirpicker
preference to true
.
A workaround to detect folder upload could include
- Use
<input type="file">
with directory
and allowdirs
attributes set, possibly including multiple
attribute, see Note, for drag and drop or user selection on click of container;
- Open
prefs.js
or about:config
and set dom.input.dirpicker
preference to Boolean
true
;
- Use modified version of "Code example" for "1. File input" at Directory Upload Demo;
- To check if upload is a
Directory
and not a single File
object, use if
with condition (filesAndDirs[0] && filesAndDirs[0].constructor.name === "Directory")
or (filesAndDirs[0] instanceof Directory)
inside of .then(function(filesAndDirectories){})
at chained to .getFilesAndDirectories()
;
- Substitute
<label>
element for <div>
element as parent of <input type="file">
. Adjust css
of input type="file"
to fill parent droppable container and set opacity
to 0
; adjust css
at parent element of input type="file"
to display text at :before
pseudo-element, over input type="file"
child element.
See also New API for directory picking and drag-and-drop.
Note, approach was tried at firefox 47, where both directories and individual files were successfully uploaded.
var dropArea = document.getElementById("dropArea");
var output = document.getElementById("result");
var ul = output.querySelector("ul");
function dragHandler(event) {
event.stopPropagation();
event.preventDefault();
dropArea.className = "area drag";
}
function filesDroped(event) {
event.stopPropagation();
event.preventDefault();
dropArea.className = "area";
var uploadFile = function(file, path) {
// handle file uploading
console.log(file, path);
var filesInfo = `<li>
Name: ${file.name}</br>
Size: ${file.size} bytes</br>
Type: ${file.type}</br>
Modified Date: ${file.lastModifiedDate}
</li>`;
ul.innerHTML += `${filesInfo}`;
};
var iterateFilesAndDirs = function(filesAndDirs, path) {
for (var i = 0; i < filesAndDirs.length; i++) {
if (typeof filesAndDirs[i].getFilesAndDirectories === 'function') {
var path = filesAndDirs[i].path;
// this recursion enables deep traversal of directories
filesAndDirs[i].getFilesAndDirectories()
.then(function(subFilesAndDirs) {
// iterate through files and directories in sub-directory
iterateFilesAndDirs(subFilesAndDirs, path);
});
} else {
uploadFile(filesAndDirs[i], path);
}
}
};
if ("getFilesAndDirectories" in event.target) {
event.target.getFilesAndDirectories()
.then(function(filesAndDirs) {
// if directory
var dir = filesAndDirs;
if (dir[0] && dir[0].constructor.name === "Directory") {
console.log(dir);
var directoryInfo = `<li>
Directory Name: ${dir[0].name}</br>
Path: ${dir[0].path}
</li>`;
ul.innerHTML += `${directoryInfo}`;
alert("isDirectory:true");
}
iterateFilesAndDirs(dir, "/");
})
} else {
// do webkit stuff
}
}
dropArea.addEventListener("dragover", dragHandler);
dropArea.addEventListener("change", filesDroped);
input[type="file"] {
width: 98%;
height: 180px;
}
label[for="file"] {
width: 98%;
height: 180px;
}
.area {
display:block;
border: 5px dotted #ccc;
text-align: center;
}
.area:after {
display: block;
border:none;
white-space: pre;
/*content: "Drop your files here!\aOr click to select files";*/
position: relative;
left: 0%;
top: -75px;
text-align:center;
}
.drag {
border: 5px dotted green;
background-color: yellow;
}
#result ul {
list-style: none;
margin-top: 20px;
}
#result ul li {
border-bottom: 1px solid #ccc;
margin-bottom: 10px;
}
<label id="dropArea" class="area">
<input id="file" type="file" allowdirs directory webkitdirectory/>
</label>
<output id="result">
<ul></ul>
</output>
jsfiddle https://jsfiddle.net/exs3ta25/31/