IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Cropper.js sauvegarder l'image recadrée


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Par défaut Cropper.js sauvegarder l'image recadrée
    Bonjour,

    Dans un projet Symfony, j'utilise Cropper.js. Tout se passe correctement, sauf que je ne sais vraiment pas comment modifier mon input file afin que celui-ci fasse référence à l'image recadrée et non à l'image uploadée.

    Voici mon javascript :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    ...
    var preview = document.getElementById('avatar_img');
    var file_input = document.getElementById('avatar_input');
    var cropper;
     
    $(document).ready(function() {
    ...
        $('#avatar_input').change(function(event) {
     
            $('#avatar_img').unwrap('span');
            $('#avatar_img').width(248);
            $('#span_keep_btn').show();
     
            previewFile(preview, file_input);
     
     
        });
     
        preview.addEventListener('load', function(event) {
     
            if(cropper) 
            {
     
                cropper.destroy();
     
            }
     
            cropper = new Cropper(preview, {
     
                aspectRatio: 1/1
            })
     
        })
     
        $('#keep_btn').click(function(event) {
     
            event.preventDefault();
     
            var croppedImage = cropper.getCroppedCanvas({
     
                maxHeight:1000,
                maxWidth: 1000
     
            });
     
            // Je voudrais modifier ici mon input file afin que mon image recadrée soit sauvegardée par la suite en base de données.
     
        });
     
    }); 
     
    function previewFile() 
    {
     
        var file = file_input.files[0];        
        var reader = new FileReader(); 
     
        reader.addEventListener('load', function(event) 
        {
     
            preview.src = reader.result;
     
        }, false);
     
        if (file) 
        {
     
            reader.readAsDataURL(file);
     
        }
     
    };
    Donc, en cliquant sur le bouton 'keep_btn', je voudrais que mon input file soit modifié pour référencer mon image recadrée.

    Quelqu'un aurait une idée sur la manière de procéder?

    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Bonjour,
    peut-être devrais tu regarder cet exemple : Upload cropped image to server, pour voir la façon de procéder.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Par défaut
    Merci beaucoup pour ton aide et ton exemple. J'y ai travaillé toute la journée.

    Cependant, dans l'exemple, il est fait appel à une fonction ajax dont je ne connais pas le traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
                f $.ajax('https://jsonplaceholder.typicode.com/posts', {
                  method: 'POST',
                  data: formData,
                  processData: false,
                  contentType: false,
    ...
    Et je ne vois toujours pas comment modifier la valeur de mon input file afin que celui-ci contienne l'image recadrée.

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Il traite des données BLOB, (Binary Large Objects), fait un simple var_dump( $_POST) pour voir ce que tu reçois et comment tu peux l'exploiter pour enregistrer les données.

    Et je ne vois toujours pas comment modifier la valeur de mon input file afin que celui-ci contienne l'image recadrée.
    Tu ne peux pas et de plus cela ne « recadrera » pas les données.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Par défaut
    Ok, encore merci pour ton aide.

    Voici comment j'y suis finalement arrivé :

    Mon js :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
     
    import { deletePhoto } from '../app';
    import { autocompleteAddress } from '../app';
    import Cropper from 'cropperjs/dist/cropper'; 
    import { getAjax } from '../app';
     
    $(document).ready(function() { 
     
        var avatar = document.getElementById('avatar_img');
        var image = document.getElementById('image');
        var input = document.getElementById('avatar_input');
        var $modal = $('#modal_avatar');
        var $alert = $('.alert');
        var $progress = $('.progress');
        var cropper;
     
        $('[data-toggle="tooltip"]').tooltip();
     
        input.addEventListener('change', function (e) {
     
            var files = e.target.files;        
            var done = function (url) {
                                        input.value = '';
                                        image.src = url;
                                        $alert.hide();
                                        $('#modal_avatar').modal('show');
                                      }
            ;
     
            var reader;
            var file;
            var url;
     
            if (files && files.length > 0) 
            {
     
                file = files[0];
     
                if (URL) 
                {
     
                    done(URL.createObjectURL(file));
     
                } 
                else if (FileReader) 
                {
     
                    reader = new FileReader();
                    reader.onload = function (e) {
     
                        done(reader.result);
     
                    };
                    reader.readAsDataURL(file);
     
                }
     
            } 
     
        });
     
        $modal.on('shown.bs.modal', function () {
     
          cropper = new Cropper(image, {
     
            aspectRatio: 1,
            viewMode: 3
     
          });
        }).on('hidden.bs.modal', function () {
     
          cropper.destroy();
          cropper = null;
     
        });
     
        document.getElementById('crop').addEventListener('click', function () {
     
          var initialAvatarURL;
          var canvas;
     
          $modal.modal('hide');
     
          if (cropper) 
          {
     
            canvas = cropper.getCroppedCanvas({
     
              width: 160,
              height: 160
     
            });
     
            initialAvatarURL = avatar.src;
            avatar.src = canvas.toDataURL();
            $progress.show();
            $alert.removeClass('alert-success alert-warning');
     
            canvas.toBlob(function (blob) {
     
              canvas.toBlob(function (blob) {
     
                saveAvatar(blob, $alert, $progress);
     
              });
     
            });
     
          }
     
        });
     
        $('body').on('click','#photoRemovingLink',function(e) {
     
            e.preventDefault();
            deletePhoto($(this));
     
        });
     
        autocompleteAddress('address_street', ' address_city', 'address_zipcode', 'address_country', 'address_number', 'address_box', 
                            'address_state', 'address_latitude', 'address_longitude', true, 'address_default_location');
     
    });
     
    function saveAvatar(blob, $alert, $progress)
    {
     
      var $progressBar = $('.progress-bar');
      var data = new FormData();
     
      data.append('file', blob);
     
      $.ajax(Routing.generate('media.avatar.save'), {
     
        type: 'POST',
        data: data,
        processData: false,
        contentType: false,  
        async:      true,
     
         xhr: function () {
     
          var xhr = new XMLHttpRequest();
     
          xhr.upload.onprogress = function (e) {
     
            var percent = '0';
            var percentage = '0%';
     
            if (e.lengthComputable) 
            {
     
              percent = Math.round((e.loaded / e.total) * 100);
              percentage = percent + '%';
              $progressBar.width(percentage).attr('aria-valuenow', percent).text(percentage);
     
            }
     
          };
     
          return xhr;
     
        },
     
        success: function (response) {
     
          $alert.show().addClass('alert-success').text('Upload success');
          console.log(response);
     
        },
     
        error: function (response) {
     
          avatar.src = initialAvatarURL;
          $alert.show().addClass('alert-warning').text('Upload error');
          console.log(response);
     
        },
     
         complete: function () {
     
          $progress.hide();
     
        },
     
      });
     
    }
    Et ma fonction de traitement :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
        /**
         * Save the avatar
         * 
         * @Route("/media/avatar/save", name="media.avatar.save", methods={"POST"}, options={"expose"=true})
         *
         * @param Request $request
         * 
         * @return Response
         */
        public function ajaxAction(Request $request, EntityManagerInterface $manager, ProfileRepository $profileRepository): Response
        {
     
            if ($request->isXmlHttpRequest()) 
            {
     
                $profile = $profileRepository->find(6);
                $photo = new Photo();
                $profile->setPhoto($photo);
     
                $tmp_name = $_FILES['file']['tmp_name'];
                $name = $_FILES['file']['name'];
                $mimeType = $_FILES['file']['type'];
     
                $file = new UploadedFile($tmp_name, $name, $mimeType);
     
                $photo->setName($name);
                $photo->setFile($file);
                $photo->setProfile($profile);
     
                 $manager->persist($profile);
                $manager->flush();
     
                $response = new JsonResponse(array('success' => 'Avatar saved'));
     
            }
            else 
            {
     
                $response = new JsonResponse(array('error' => 'Not a XmlHttpRequest'));
     
            }
     
     
            return $response;
     
        }
     
        public function generateUniqueName()
        {
     
            return md5(uniqid());
     
        }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion d'image recadrées et de clics
    Par ndech dans le forum Qt
    Réponses: 1
    Dernier message: 21/04/2010, 12h34
  2. [AJAX] Recadrer une image en ligne
    Par wishmastah dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/06/2007, 09h37
  3. comment recadrer une image si elle sort de la page
    Par orguy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/05/2007, 15h40
  4. [PHP-JS] recadrer une image dynamiquement
    Par gforce dans le forum Langage
    Réponses: 1
    Dernier message: 17/11/2006, 12h40
  5. recadrer (rogner) une image
    Par prodi_64 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 19/10/2004, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo