Saltar al contenido

Usando cropper.js antes de que Dropzone.js envíe la imagen al servidor

Intenta entender el código correctamente previamente a adaptarlo a tu trabajo y si ttienes algo que aportar puedes compartirlo con nosotros.

Solución:

Probablemente ya no lo necesites, pero lo dejaré aquí 🙂

Fue un poco complicado y mi solución probablemente sea de alguna manera ‘hackish’, pero funciona y no tiene que cargar archivos en el servidor para cambiar el tamaño.

También estoy usando cropper en una ventana modal. Quería obligar al usuario a recortar la imagen a ciertas dimensiones antes de cargarla en el servidor.

Después de confirmar el recorte en una imagen modal, se carga instantáneamente.

// transform cropper dataURI output to a Blob which Dropzone accepts
function dataURItoBlob(dataURI) 
    var byteString = atob(dataURI.split(',')[1]);
    var ab = new ArrayBuffer(byteString.length);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < byteString.length; i++) 
        ia[i] = byteString.charCodeAt(i);
    
    return new Blob([ab],  type: 'image/jpeg' );


// modal window template
var modalTemplate = '';

// initialize dropzone
Dropzone.autoDiscover = false;
var myDropzone = new Dropzone(
    "#my-dropzone-container",
    
        autoProcessQueue: false,
        // ..your other parameters..
    
);

// listen to thumbnail event
myDropzone.on('thumbnail', function (file) 
    // ignore files which were already cropped and re-rendered
    // to prevent infinite loop
    if (file.cropped) 
        return;
    
    if (file.width < 800) 
        // validate width to prevent too small files to be uploaded
        // .. add some error message here
        return;
    
    // cache filename to re-assign it to cropped file
    var cachedFilename = file.name;
    // remove not cropped file from dropzone (we will replace it later)
    myDropzone.removeFile(file);

    // dynamically create modals to allow multiple files processing
    var $cropperModal = $(modalTemplate);
    // 'Crop and Upload' button in a modal
    var $uploadCrop = $cropperModal.find('.crop-upload');

    var $img = $('
'); // initialize FileReader which reads uploaded file var reader = new FileReader(); reader.onloadend = function () // add uploaded and read image to modal $cropperModal.find('.image-container').html($img); $img.attr('src', reader.result); // initialize cropper for uploaded image $img.cropper( aspectRatio: 16 / 9, autoCropArea: 1, movable: false, cropBoxResizable: true, minContainerWidth: 850 ); ; // read uploaded file (triggers code above) reader.readAsDataURL(file); $cropperModal.modal('show'); // listener for 'Crop and Upload' button in modal $uploadCrop.on('click', function() // get cropped image data var blob = $img.cropper('getCroppedCanvas').toDataURL(); // transform it to Blob object var newFile = dataURItoBlob(blob); // set 'cropped to true' (so that we don't get to that listener again) newFile.cropped = true; // assign original filename newFile.name = cachedFilename; // add cropped file to dropzone myDropzone.addFile(newFile); // upload cropped file with dropzone myDropzone.processQueue(); $cropperModal.modal('hide'); ); );

Para desarrolladores que no quieren o no pueden tener la dependencia de jQuery.

Recientemente escribí un artículo sobre la integración de Dropzone con Cropper.js, podría ser útil. Consulte el fragmento de código del artículo siguiente.

el html

el JavaScript

Dropzone.options.myDropzone = 
    url: '/post',
    transformFile: function(file, done) 

        var myDropZone = this;

        // Create the image editor overlay
        var editor = document.createElement('div');
        editor.style.position = 'fixed';
        editor.style.left = 0;
        editor.style.right = 0;
        editor.style.top = 0;
        editor.style.bottom = 0;
        editor.style.zIndex = 9999;
        editor.style.backgroundColor = '#000';

        // Create the confirm button
        var confirm = document.createElement('button');
        confirm.style.position = 'absolute';
        confirm.style.left = '10px';
        confirm.style.top = '10px';
        confirm.style.zIndex = 9999;
        confirm.textContent = 'Confirm';
        confirm.addEventListener('click', function() 

            // Get the canvas with image data from Cropper.js
            var canvas = cropper.getCroppedCanvas(
                width: 256,
                height: 256
            );

            // Turn the canvas into a Blob (file object without a name)
            canvas.toBlob(function(blob) 

                // Update the image thumbnail with the new image data
                myDropZone.createThumbnail(
                    blob,
                    myDropZone.options.thumbnailWidth,
                    myDropZone.options.thumbnailHeight,
                    myDropZone.options.thumbnailMethod,
                    false, 
                    function(dataURL) 

                        // Update the Dropzone file thumbnail
                        myDropZone.emit('thumbnail', file, dataURL);

                        // Return modified file to dropzone
                        done(blob);
                    
                );

            );

            // Remove the editor from view
            editor.parentNode.removeChild(editor);

        );
        editor.appendChild(confirm);

        // Load the image
        var image = new Image();
        image.src = URL.createObjectURL(file);
        editor.appendChild(image);

        // Append the editor to the page
        document.body.appendChild(editor);

        // Create Cropper.js and pass image
        var cropper = new Cropper(image, 
            aspectRatio: 1
        );

    
;

Puede encontrar una demostración del código de integración aquí: https://codepen.io/rikschennink/pen/PXQNGp?editors=0010

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *