Search code examples
jqueryhtmldrag-and-drop

jQuery HTML5 file drag and drop


I have looked at many scripts for uploading images to the server with AJAX with drag and drop. The scripts I found are not jQuery, are quite large and don't do exactly what I want.

In the future it should upload an image with jQuery, AJAX and PHP.

My question

In many of the example I've looked at e.dataTransfer.files work. In my case it don't. Do I need to bind it somehow?

I want jQuery as much as possible.

JsFiddle

Play around as much as you like...

http://jsfiddle.net/AMjEz/

Code

<html>
    <head>
        <style type="text/css">
            #dropzone {
                border: 2px dashed #ccc;
                width: 300px;
                height: 200px;
            }
        </style>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
        <script type="text/javascript">
            jQuery(document).ready(function($) {
                $('#dropzone').on({
                    dragenter: function(e) {
                        $(this).css('background-color', 'lightBlue');
                    },
                    dragleave: function(e) {
                        $(this).css('background-color', 'white');
                    },
                    drop: function(e) {
                        e.stopPropagation();
                        e.preventDefault();
                        console.log(e.dataTransfer.files);
                    }
                });
            });
        </script>
    </head>
    <body>
        <div id="dropzone">
            Drop files here
        </div>
    </body>
</html>

Solution

  • I found out that it's a bug in jQuery.1.8. This row should be before $('.dropzone').

    $.event.props.push('dataTransfer');
    

    Final HTML code

    <html>
        <head>
            <style type="text/css">
                .dropzone {
                    border: 2px dashed #ccc;
                    width: 300px;
                    height: 200px;
                }
            </style>
            <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
            <script type="text/javascript">
                jQuery(document).ready(function($) {
                    var filename = '';
                    var image_data = '';
    
                    $.event.props.push('dataTransfer');
                    $('.dropzone').on({
                        dragenter: function(e) {
                            $(this).css('background-color', 'lightBlue');
                        },
                        dragleave: function(e) {
                            $(this).css('background-color', 'white');
                        },
                        drop: function(e) {
                            e.stopPropagation();
                            e.preventDefault();
    
                            var file = e.dataTransfer.files[0];
                            var fileReader = new FileReader();
    
                            var this_obj = $(this);
    
                            fileReader.onload = (function(file) {
                                return function(event) {
                                    // Preview
                                    filename = file.name;
                                    image_data = event.target.result;
                                    $(this_obj).next().html('<a href="#" class="upload-file">Upload file</a>');
                                    $(this_obj).html('<img style="max-width: 200px; max-height: 200px;" src="' + event.target.result + '">');
                                };
                            })(file);
    
                            fileReader.readAsDataURL(file);         
                        }
                    });
    
                    // Upload file
                    $(".upload-file").live("click", function(e){
                        e.preventDefault();
    
                        var this_obj = $(this);
                        var image_data = $(this_obj).parent().prev().find('img').attr('src');
    
                        $.post(
                            'send_image.php',
                            {
                                data: image_data,
                                filename: filename
                            }, function(response){  
                                $(this_obj).parent().prev().html(response);
                                $(this_obj).remove();
                            }
                        );
    
                        //console.log('ok');
                    });
    
                });
            </script>
        </head>
        <body>
            <!-- Multiple dropzones -->
            <div class="dropzone">
                Drop files here
            </div>
            <div id="meta"></div>
            <div class="dropzone">
                Drop files here
            </div>
            <div id="meta"></div>
        </body>
    </html>
    

    PHP code in send_image.php

    <?php
    $raw_data = $_POST['data'];
    
    file_put_contents(
        'image123.jpg',
        base64_decode( 
            str_replace('data:image/jpeg;base64,', '', $raw_data)
        )
    );
    ?>
    
    <br>
    
    <?php echo '<img style="max-width: 200px; max-height: 200px;" src="' . 'image123.jpg' . '">'; ?>