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 :

Upload d'un fichier image modifié


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Par défaut Upload d'un fichier image modifié
    Bonjour à tous et merci d'avance pour vos lumières.

    Le contexte :
    Il s'agit d'un site de recettes de cuisine dans lequel les membres peuvent insérer des recettes accompagnées de photos.
    Le PHP de base ne me pose aucun souci, traiter un formulaire avec des input de type "file" est un grand classique.
    Je propose de plus en JavaScript, après avoir choisi une photo,
    1. de la visualiser dans un élément HTML "img". Là encore, aucun souci, tout se passe bien.
    2. de la recadrer. Cela se passe dans un canvas inséré dans une lightbox et fonctionne parfaitement. Dès que l'utilisateur a terminé, il clique sur un bouton de la lightbox, celle-ci disparaît et la photo recadrée vient remplacer la photo originale dans l'élément "img" correspondant. C'est l'upload de la photo recadrée qui me pose problème.

    Fonctionnement :
    Pour récupérer la photo recadrée, je me sers d'un second canvas invisible (display:none) dans lequel je crée un nouvel élément grâce à getContext('2d') et où je redessine l'image avec la fonction drawImage() puis je l'affiche dans l'élément "img" en lui donnant comme source la valeur obtenue par la fonction toDataURL().

    Mais l'upload de cette source me conduit systématiquement à une erreur, voici le code de cette fonction que j'utilise certainement mal :
    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
    function uploadFile(nomInpFile, imgSrc)
    {
    	var	xhr = new XMLHttpRequest(),
    		formData = new FormData();
     
    	formData.append(nomInpFile, imgSrc);
    	xhr.open('POST', urlDest, true);
    	xhr.onload = function(){
    		//alert(nomInpFile+' téléchargé dans '+urlDest);
    		handleComplete(imgSrc.size);
    	};
    	xhr.onerror	= function(){
    		alert(this.responseText);
    		handleComplete(imgSrc.size);
    	};
    	xhr.upload.onprogress = function(event){
    		handleProgress(event);
    	}
    	xhr.send(formData);
    }
    Les arguments que j'utilise pour cette fonction :
    - nomInpFile est le nom de l'input de type "file" du formulaire
    - imgSrc est la chaîne source de l'élément "img" dont je parle plus haut (*)
    Le contenu de la chaîne urlDest est le fichier PHP qui va traiter le formulaire avec son chemin complet ('https [...... ] fichier.php')
    NB : le "alert" n'est là que pour la mise au point et il m'indique que l'upload s'est bien passé...
    Mais quand je valide le formulaire (bouton de type "submit"), je n'ai pas de fichier chargé dans le input "file" ($_FILES[$nomInpFile]['tmp_name'] est vide).

    Éclairez-moi SVP.

  2. #2
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Bonsoir,
    Citation Envoyé par PhilippeF75 Voir le message
    - imgSrc est la chaîne source de l'élément "img" dont je parle plus haut (*)
    Le point à revoir pourrait se situer ici.

    Je n'ai plus trop canvas en tête, mais j'ai fait un test qui fonctionne en reprenant le code à l'identique.
    Voici deux variantes qui permettent de faire arriver l'image dans $_FILES :

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    canvas.toBlob(function(blob) {uploadFile("voiture",blob);},"image/jpeg",0.9);
    Pour cette version, on peut ajouter un troisième paramètre dans le append : formData.append(nomInpFile, imgSrc, "voiture.jpg");

    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    canvas.toBlob(function(blob) {uploadFile("voiture",new File([blob],"voiture.jpg",{type:blob.type}));},"image/jpeg",0.9);
    Dans les deux cas, on aura $_FILES['voiture']['name'] qui vaudra "voiture.jpg".


    Je laisse également mon test complet :
    Code html : 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
    <image src="alpine.jpg">
    <script>
    const urlDest="test.php";
    function handleProgress() {}
    function handleComplete() {}
     
    function uploadFile(nomInpFile, imgSrc)
    {
            var     xhr = new XMLHttpRequest(),
                    formData = new FormData();
     
    //      formData.append(nomInpFile, imgSrc, "voiture.jpg"); //version 1
            formData.append(nomInpFile, imgSrc); //version 2
            xhr.open('POST', urlDest, true);
            xhr.onload = function(){
                    //alert(nomInpFile+' téléchargé dans '+urlDest);
                    handleComplete(imgSrc.size);
            };
            xhr.onerror     = function(){
                    alert(this.responseText);
                    handleComplete(imgSrc.size);
            };
            xhr.upload.onprogress = function(event){
                    handleProgress(event);
            }
            xhr.send(formData);
    }
     
    document.getElementsByTagName("img")[0].addEventListener("load",function tutu() {
            this.removeEventListener("load",tutu);
            const canvas=document.createElement("canvas");
            canvas.setAttribute('width',this.width);
            canvas.setAttribute('height',this.height);
            canvas.getContext("2d").drawImage(this,0,0);
    //      canvas.toBlob(function(blob) {uploadFile("voiture",blob);},"image/jpeg",0.9); //version 1
            canvas.toBlob(function(blob) {uploadFile("voiture",new File([blob],"voiture.jpg",{type:blob.type}));},"image/jpeg",0.9); //version 2
    });
    </script>
    test.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php move_uploaded_file($_FILES['voiture']['tmp_name'],$_FILES['voiture']['name']);?>
    Je ne dis pas que c'est la meilleure méthode, j'ai fait tout ça un peu de mémoire et en reprenant une partie d'un code que j'avais déjà mis sur le forum.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Par défaut
    Bonsoir et merci Loralina pour ces pistes que je vais explorer rapidement.

    Voilà qui est fait. Ca marche super bien ! J'ai utilisé la version 2 pour des raisons pratiques.
    Merci à toi, tu me sors d'un joli pétrin.

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

Discussions similaires

  1. Limiter l'upload d'un fichier image ?
    Par sky1989 dans le forum Langage
    Réponses: 4
    Dernier message: 27/02/2012, 10h39
  2. [Upload] Upload d'un fichier image
    Par lonycc dans le forum Langage
    Réponses: 8
    Dernier message: 05/10/2008, 21h07
  3. [Upload] Upload d'un fichier image
    Par Rothul dans le forum Langage
    Réponses: 2
    Dernier message: 04/12/2007, 14h03
  4. [Upload] upload de fichier images
    Par omlip dans le forum Langage
    Réponses: 2
    Dernier message: 03/01/2006, 23h13
  5. [Upload] probleme de récupération de fichier image
    Par BernardT dans le forum Langage
    Réponses: 2
    Dernier message: 15/11/2005, 01h12

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