Skip to content

Instantly share code, notes, and snippets.

@Ficik
Created May 2, 2016 17:08
Show Gist options
  • Select an option

  • Save Ficik/8f53bd081ecdaab6868015ba5296472f to your computer and use it in GitHub Desktop.

Select an option

Save Ficik/8f53bd081ecdaab6868015ba5296472f to your computer and use it in GitHub Desktop.
Simple fetch file uploader with file input and dropzone
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript" src="uploader.js"></script>
<style media="screen">
.dropzone {
padding:40px;
background-color:silver;
transition: background-color 400ms;
}
.dropzone--active {
background-color: blue;
}
</style>
</head>
<body>
<!-- Uploader start -->
<div data-file-upload="/upload" class="dropzone">
<input type="file" multiple="multiple">
</div>
<!-- Uploader end -->
</body>
</html>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function(event) {
var fileUploadWrappers = document.querySelectorAll("[data-file-upload]");
Array.prototype.forEach.call(fileUploadWrappers, function(fileUploadWrapper) {
fileUploadWrapper.addEventListener("uploadsucess", function(event){
console.log("Success", event);
});
fileUploadWrapper.addEventListener("uploadfailed", function(event){
console.log("Failed", event);
});
});
});
</script>
document.addEventListener("DOMContentLoaded", function(event) {
var fileUploadWrappers = document.querySelectorAll("[data-file-upload]");
var uploadFile = function(fileUploadWrapper, url, file) {
fetch(url, {
method: 'POST',
body: file,
headers: {
"X-Filename": file.name
}
}).then(function(response){
if (!response.ok) {
throw response;
}
var ev = new Event("uploadsucess");
ev.file = file;
fileUploadWrapper.dispatchEvent(ev);
}).catch(function(){
var ev = new Event("uploadfailed");
ev.file = file;
fileUploadWrapper.dispatchEvent(ev);
});
};
var uploadFiles = function(fileUploadWrapper, url, files) {
Array.prototype.forEach.call(files, function(file) {
uploadFile(fileUploadWrapper, url, file);
});
};
Array.prototype.forEach.call(fileUploadWrappers, function(fileUploadWrapper) {
var fileInput = fileUploadWrapper.querySelector('input[type="file"]');
var url = fileUploadWrapper.dataset.fileUpload;
fileUploadWrapper.addEventListener('drop', function(event) {
event.preventDefault();
uploadFiles(fileUploadWrapper, url, event.dataTransfer.files);
});
fileUploadWrapper.addEventListener('dragover', function(event) {
// prevent to make drop work
event.preventDefault();
});
fileUploadWrapper.addEventListener('dragenter', function(event) {
event.preventDefault();
fileUploadWrapper.classList.add('dropzone--active');
});
fileUploadWrapper.addEventListener('dragleave', function(event) {
console.log(event);
event.preventDefault();
fileUploadWrapper.classList.remove('dropzone--active');
});
fileInput.addEventListener('change', function(){
uploadFiles(fileUploadWrapper, url, fileInput.files);
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment