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

AngularJS Discussion :

Récupération EXIF lors d'un Upload multiple Angular


Sujet :

AngularJS

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3
    Par défaut Récupération EXIF lors d'un Upload multiple Angular
    Bonjour tout le monde !

    J'ai un problème que je n'arrive pas à résoudre depuis quelques jours :

    Je construit une plateforme pour une entreprise, une banque d'image/galerie photo, avec Angular.
    Sur la page qui permet l'upload des images, j'utilise le module ng-file-upload, qui me fournit une drop-zone et la possibilité d'envoyer dplusieures images à la fois. Le module marche très bien.

    Je dois également récuperer les données EXIF des photos lors de la sélection et les envoyer avec $http.post. J'utilise pour cela exif.js, pour lire ces données et sélectionner celles qui m'interessent.

    Comme il s'agit d'un seul envoie $http.post, je voudrai envoyer un tableau multidimensionnel ou chaque valeur contient les données d'une photo, sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    exif = [0: {
    marque:...,
    modele:...,
    ....},
    1:{
    marque:...,
    modele:...,
    ....},
    2:{...}
    ]
    Et... je n'y arrive pas ! J'ai le nez dedans depuis le début de la semaine, je vois pas la solution..

    Je vous soumet mon code, si quelqu'un à un avis, je suis intéressé !!

    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
     
    app.controller('uploadCtrl', ['$scope', 'Upload', '$timeout', '$http', function($scope, Upload, $timeout, $http) {
     
     
      // recup EXIF =====================================================================
      $scope.getExif = function(files) {
        $scope.files = files;
        $scope.exif = new Array();
        EXIF.getData(files, function() {
          for (var i = 0; i < files.length; i++) {
            var file = files[i];
            $scope.exif[i] = new Object();
            $scope.exif[i].marque = EXIF.getTag(file, "Make");
            $scope.exif[i].modele = EXIF.getTag(file, "Model");
            $scope.exif[i].iso = EXIF.getTag(file, "ISOSpeedRatings");
            $scope.exif[i].fnumber = 'f:' + (EXIF.getTag(file, "FNumber"));
            $scope.exif[i].vit_obt = '1/' + Math.pow(EXIF.getTag(file, "ExposureTime"), -1);
            $scope.exif.push($scope.exif[i]);
          }
        })
      };
     
     
     
      // upload=======================================================
      $scope.uploadFiles = function(files) {
     
        if (files && files.length) {
          $scope.files = files;
          Upload.upload({
              url: 'php/managePhoto.php',
              method: 'POST',
              file: files,
              data: {
                categorie: $scope.categorie,
                s_categorie: $scope.s_categorie,
                galerie: $scope.galerie,
                user: $scope.user,
                exif: $scope.exif
              }
            })
            .then(function(response) {
              $timeout(function() {
                $scope.result = response.data;
              });
            }, function(response) {
              if (response.status > 0) {
                $scope.errorMsg = response.status + ': ' + response.data;
              }
            }, function(evt) {
              $scope.progress =
                Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
            });
        }
      };
     
      // envoie des données par SUBMIT ================================================
      $scope.submit = function() {
        $scope.uploadFiles($scope.files)
      };
     
    }]);
    Merci !!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour, Voici une tentative de réponse, je ne garantis pas qu'elle fonctionne...

    Soit $scope.exif un tableau [] vide,

    Alors, il faut utiliser la fonction push() pour y insérer des objets JSON {} de manière additive :

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $scope.exif.push({'monObjet1':'contenu'});
    $scope.exif.push({'monObjet2':'contenu2'});
    ce qui nous donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $scope.exif =[{'monObjet1':'contenu'},{'monObjet2':'contenu2'}];

    Sachant que les variables contenu et contenu2 peuvent être obtenues par la valeur de retour d'une fonction comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $scope.exif =[{'monObjet1':getContenu()},{'monObjet2':getContenu2()}];
    , j'en déduis que la boucle FOR est indiquée dans ton cas, pour "pusher" les objets à la suite dans le tableau.


    Voici donc, à vue de nez comment j'essayerais de faire, moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var x = 0;
    for(x=0;x<$scope.files.length;x++){
            $scope.exif.push({'marque':EXIF.getTag($scope.files[x], "Make")},{'modele':EXIF.getTag($scope.files[x], "Model")},{'iso':EXIF.getTag($scope.files[x], "ISOSpeedRatings")});
    }
    Je ne mets pas toutes les catégories dans le PUSH(), c'est trop long à écrire là...

    Je sais pas, moi je testerais un truc comme ça pour un seul fichier ... Le problème étant que, vu que c'est un upload multiple, il faudrait probablement créer une boucle for imbriquée qui traite chaque fichier uploadé, et là... Sans être devant le programme, je vois pas trop.. ou alors, faudrait faire $scope.exif.fichier1.push(bla bla) puis $scope.exif.fichier2.push(bla bla) mais dans la boucle for, et retrouver le nom de chaque fichier avant de spécifier ses données exif
    Dernière modification par Invité ; 04/07/2016 à 15h03.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 207
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EXIF.getData(files, function() {
      for (var i = 0; i < files.length; i++) {
    tu ne peux pas faire la boucle dans la function callBack qui ne traite de toutes façons que l'élément lui même.

    Il te faut faire la boucle autour de la fonction, par exemple
    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
    $scope.files = files;
    $scope.data = [];
    angular.forEach(files, function (file) {
        EXIF.getData(file, function () {
            console.log('img : ', this);
            var tags = EXIF.getAllTags(this);
            $scope.data.push({
                'marque': tags.Make,
                'modele': tags.Model,
                'iso': tags.ISOSpeedRatings,
                'fnumber': tags.FNumber,
                'vit_obt': '1/' + Math.pow(tags.ExposureTime, - 1)
            });
        });
    });
    $scope.affiche($scope.data);

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3
    Par défaut
    Super !!
    Je vais tester ça au plus vite, merci de vos réponse, je vous tiens au courant !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Waah trop bien la solution du modérateur est trop toop (et la bonne), je m'en inspirerais à l'avenir, surtout le angular.forEach ! ! Très joli code super instructif !

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 207
    Par défaut
    ...surtout le angular.forEach ! !
    et pourtant il suffit parfois de lire la documentation

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

Discussions similaires

  1. Récupération d'un nom de fichier lors de l'upload
    Par adel25 dans le forum Langage
    Réponses: 3
    Dernier message: 01/02/2009, 19h39
  2. [Upload] Upload multiple files
    Par aymanov dans le forum Langage
    Réponses: 17
    Dernier message: 22/12/2008, 09h38
  3. [Upload] traitement upload multiples
    Par renaud26 dans le forum Langage
    Réponses: 7
    Dernier message: 23/03/2006, 19h20
  4. [demande] upload multiples
    Par pIch dans le forum Général Java
    Réponses: 6
    Dernier message: 21/07/2005, 15h47
  5. [Upload] upload multiple
    Par mat10000 dans le forum Langage
    Réponses: 3
    Dernier message: 16/06/2005, 17h07

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