Jquery : upload file (drag or upload)

by dshilkret

HTML

<div id="upload">
<p>Drag your file or upload it</p>
<input type="file">
</div>

CSS

#upload {
    border: 2px dashed lightgrey;
    margin-bottom: 15px;
    padding: 10px;
    text-align: center;
    position: relative;
}
#upload.is-dragover {
    background-color: rgba(0, 0, 0, 0.05);
}
#upload .loader {
    position: absolute;
    top: 0; left: 0;
    width: 100%; height: 100%;
    background-color: #f5f5f5;
}
#upload .loader .fa-spinner {
     margin-top: 0.5em;
}

JavaScript

var Upload = {

    // Handle events it the box
    init: function() {
        var upload = $("#upload");
        upload.on('drag dragstart dragend dragover dragenter dragleave drop', function(e) {
            e.preventDefault();
            e.stopPropagation();
        })
        .on('dragover dragenter', function() { upload.addClass('is-dragover'); })
        .on('dragleave dragend drop', function() { upload.removeClass('is-dragover'); })
        .on('drop', function(e) {
            files = e.originalEvent.dataTransfer.files;
            Upload.submit(files);
        });

        upload.on('change', 'input', function(e) {
          Upload.submit(this.files);
        });
    },
    
    // Check the uploaded file
    submit: function(files) {

        // Check file extension and size
        var file = files[0];
        var type = file['type'].substr(0, file['type'].indexOf('/'));
       /* if(type != 'image') {
            alert('This file type is not supported. Only images should be uploaded');
            return;
        }*/
        if(file['size'] > 10485760) {
            alert('This file is too heavy, it weights more than 10M');
            return;
        }
        Upload.display(file);
    },
    
    // Display an uploaded file
    display: function(file) {
        var div    = document.createElement("input");
        var reader = new FileReader();
        reader.onloadend = function() {
          div.src = reader.result;
        }
        reader.readAsDataURL(file);
        $("body").append(div);
    },
    
    // Upload via AJAX
    upload: function(file) {
        var loader = $('<div class="loader">'
                        + '<i class="fa fa-spinner fa-pulse fa-3x fa-fw margin-bottom"></i>'
                    + '</div>').prependTo($('#upload'));
                    
        // Create a form
        var fd = new FormData();
        fd.append('pdf', file);
          
        $.ajax({
            url: '...',
            data: fd,
           ...