Partage
  • Partager sur Facebook
  • Partager sur Twitter

Contenu d'un input file interprété différemment sous IE

IE, encore et toujours IE...

Sujet résolu
    10 septembre 2010 à 21:45:54

    Salut à tous,

    J'ai posté ce topic dans la catégorie JS car je pense que le problème vient de là. Voici mon problème :

    J'ai des champs input de type file qui sont ajouté "dynamiquement" grâce à DOM en javascript :

    function createChampPhotoSuppr(cle) {
    	if (document.getElementById("suppr_img_"+cle).checked==true)
    	{
    		// Ajout de l'input en DOM
    		var contenu = document.getElementById("input_photo_modif_"+cle);
    
    		var label = document.createElement("label");
    		var texte_label = document.createTextNode("Nouvelle photo :");
    		var input = document.createElement("input");
    		input.setAttribute("type","file");
    		input.setAttribute("name","photo_" + cle + "");
    		var br = document.createElement("br");
    
    		label.appendChild(texte_label); // On accroche le texte dans le label
    		contenu.appendChild(label); // On accroche le label au contenu
    		contenu.appendChild(input); // On accroche l'input au contenu
    		contenu.appendChild(br); // On accroche le br au contenu
    	}
    	else
    	{
    		// Suppression de l'input
    		var contenu = document.getElementById("input_photo_modif_"+cle);
    		while(contenu.hasChildNodes()==true)
    		{
    			var contenu_suppr = contenu.firstChild; 
       			contenu.removeChild(contenu_suppr);
    		}
    	}
    }
    


    La fonction JS est appelée de cette manière :

    echo '<label>Photo additionnelle :</label><img id="img_'.$cle.'" src="../upload/images/annonces_particuliers/'.$donnees['id'].'/photos/thumbnails/'.$fname.'" width="80" height="59" style=""/>
    	<input type="checkbox" name="suppr_img" id="suppr_img_'.$cle.'" onclick="createChampPhotoSuppr(\''.$cle.'\')" /> <label class="small">Supprimer la photo</label><br />
    	<div id="input_photo_modif_'.$cle.'"></div>';
    


    Enfin voilà cela permet lorsqu'on coche une checkbox "Supprimer la photo" d'ajouter un champ input file pour sélectionner une photo de remplacement. Le contenu (la photo) de l'input file est ensuite récupéré avec la méthode POST de php et la photo est enregistrée dans un répertoire grâce à un script d'upload. Ce script teste bien entendu le format du fichier, et le seul que j'ai autorisé est le JPG.

    Mais problème... Sous Firefox, pas de souci, la photo est bien enregistrée. Sous IE par contre rien à faire, le script d'upload me retourne toujours "Format de fichier incorrecte. Uniquement .jpeg / .jpg / .JPG"


    Pourtant j'utilise la même image sous les deux navigateurs...

    Alors je pense que le problème vient de mon code d'input en DOM. Il ne peut pas venir de PHP car c'est exécuté côté serveur, donc c'est automatiquement un problème de javascript ou bien xHTML, mais je ne pense pas.

    J'ai utilisé le DOM car j'ai lu un peu partout que innerHTML était déconseillé.

    Enfin voilà, quelqu'un aurait-il une idée ?

    Merci ;)
    • Partager sur Facebook
    • Partager sur Twitter
      10 septembre 2010 à 22:38:55

      A la description du problème, on dirait que ça vient plus du script PHP que du script Javascript, mais il est vrai que le fait que cela fonctionne sur Firefox et non sur IE est étrange.

      Tu pourrais nous passer ton code PHP ?
      • Partager sur Facebook
      • Partager sur Twitter
        10 septembre 2010 à 22:57:04

        Voici ;)

        <?php
        // Taille maximum
        $MAX_FILE_SIZE = 5000000; // Taille max du fichier : 5 Mo
        
        // Dossier de destination du fichier
        $folder = '../upload/images/annonces_particuliers/'.$id_dossier.'/photos/';
        
        // Tableau array des différents types
        $allowed_types = array("image/jpeg");
        
        // Variables récupères par methode POST du formulaire
        $fname = $HTTP_POST_FILES['photo_'.$i_photo.'']['name'];
        $ftype = $HTTP_POST_FILES['photo_'.$i_photo.'']['type'];
        $fsize = $HTTP_POST_FILES['photo_'.$i_photo.'']['size'];
        $ftmp = $HTTP_POST_FILES['photo_'.$i_photo.'']['tmp_name'];
        
        // Changement du nom du fichier
        $extension = strrchr($fname,'.');
        $extension = substr($extension,1); 
        $fname = ($id_dossier.'-'.$i_photo);
        $fname = ($fname.'.'.$extension);
        
        // Récupération des dimensions
        $dim = getimagesize($ftmp);
        
        echo '<p align="center">';
        
        if (!in_array($ftype, $allowed_types)) // Le fichier n'est pas une image jpeg
        {
        	echo 'Format de fichier incorrecte. Uniquement .jpeg / .jpg / .JPG<br /><br />
        	<a href="javascript:history.back();">Retour</a>';
        	exit();
        }
        if ($fize > $MAX_FILE_SIZE) // La taille du fichier est trop grande
        {
        	echo 'La photo n°'.$i_photo.' est trop volumineuse<br /><br />
        	<a href="javascript:history.back();">Retour</a>';
        	exit();
        }
        if (file_exists($folder.''.$fname)) // Le fichier existe déjà
        {
        	echo 'Fichier d&eacute;j&agrave; existant : '.$folder.''.$fname.'<br /><br />
        	<a href="javascript:history.back();">Retour</a>';
        	exit();
        }
        
        echo '</p>';
        
        copy($ftmp,''.$folder.''.$fname.''); // On enregistre l'image dans le dossier de destination
        
        • Partager sur Facebook
        • Partager sur Twitter
          10 septembre 2010 à 23:51:10

          en fait, je comprends pas vraiment ton code.

          un script de finalisation d'upload en PHP, c'est sensé ressembler à ça :
          (http://antoine-herault.developpez.com/tutoriels/php/upload/#L3)

          <?php
          $dossier = 'upload/';
          $fichier = basename($_FILES['avatar']['name']);
          $taille_maxi = 100000;
          $taille = filesize($_FILES['avatar']['tmp_name']);
          $extensions = array('.png', '.gif', '.jpg', '.jpeg');
          $extension = strrchr($_FILES['avatar']['name'], '.'); 
          //Début des vérifications de sécurité...
          if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
          {
               $erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...';
          }
          if($taille>$taille_maxi)
          {
               $erreur = 'Le fichier est trop gros...';
          }
          if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
          {
               //On formate le nom du fichier ici...
               $fichier = strtr($fichier, 
                    'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
                    'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
               $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
               if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
               {
                    echo 'Upload effectué avec succès !';
               }
               else //Sinon (la fonction renvoie FALSE).
               {
                    echo 'Echec de l\'upload !';
               }
          }
          else
          {
               echo $erreur;
          }
          ?>
          


          bon, après, il y a peut-être d'autres manières de faire, mais là je vois pas du tout à quoi ça correspond.

          ton $HTTP_POST_FILES a l'air similaire à $_FILES, mais je n'ai jamais vu $HTTP_POST_FILES.
          et d'où viennent $i_photo et $id_dossier ?
          • Partager sur Facebook
          • Partager sur Twitter
            10 septembre 2010 à 23:58:20

            T'inquiète le script d'upload fonctionne parfaitement. La variable $i_photo est en fait l'id des différentes photos afin de stocker leur nom dans un array qui ensuite est enregistré en bdd.

            Enfin bref, je pense que l'on s'écarte du problème, je suis quasiment persuadé que le souci est javascript et non pas PHP. Le javascript s'exécute côté client, donc si il y a encore un bug sous IE pour je ne sais quel truc, cela doit venir de là.
            • Partager sur Facebook
            • Partager sur Twitter
              11 septembre 2010 à 0:13:13

              le seul truc que je vois, c'est qu'IE ne renverrait peut-être pas les données nécessaires à la compréhension de ceci :

              $allowed_types = array("image/jpeg");

              maintenant, c'est peut-être totalement faux, mais je crois que tu devrais tester ça de manière plus classique.

              $allowed_types = array('.JPG', '.jpg', '.jpeg');

              ce qui me fait penser que le problème ne vient pas de javascript, mais de IE en lui-même, c'est que manifestement, IE envoie quand même l'image au serveur et c'est au niveau du serveur qu'il y a un problème au traitement d'un fichier qui vient d'IE...

              Bon et bien voilà qui corrobore ma théorie : http://support.microsoft.com/kb/815455

              Et voilà qui pourrait t'intéresser : http://forum.alsacreations.com/topic-2 [...] -firefox.html

              on aurait donc $allowed_types = array("image/jpeg","image/pjpeg");
              • Partager sur Facebook
              • Partager sur Twitter
                11 septembre 2010 à 0:24:32

                Citation : kef_hin

                maintenant, c'est peut-être totalement faux, mais je crois que tu devrais tester ça de manière plus classique.

                $allowed_types = array('.JPG', '.jpg', '.jpeg');



                Ça aurait pu être ça effectivement, mais malheureusement ça change rien :(

                Citation : kef_hin

                ce qui me fait penser que le problème ne vient pas de javascript, mais de IE en lui-même, c'est que manifestement, IE envoie quand même l'image au serveur et c'est au niveau du serveur qu'il y a un problème au traitement d'un fichier qui vient d'IE...

                Bon et bien voilà qui corrobore ma théorie : http://support.microsoft.com/kb/815455



                Donc si je pige bien c'est en fait que IE contrairement à Firefox, examine vraiment le fichier pour en déterminer le type MIME, alors que Firefox se contente surement seulement que l'extension du fichier. Donc moi fichier jpg ne serait pas vraiment un fichier jpg correct ?
                • Partager sur Facebook
                • Partager sur Twitter
                  11 septembre 2010 à 0:28:14

                  Désolé, je modifiais mon message pendant que tu écrivais ta réponse :

                  Citation : kef_hin

                  Et voilà qui pourrait t'intéresser : http://forum.alsacreations.com/topic-2 [...] -firefox.html

                  on aurait donc $allowed_types = array("image/jpeg","image/pjpeg");

                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 septembre 2010 à 0:32:39

                    Ahhh super ! Ça fonctionne avec $allowed_types = array("image/jpeg","image/pjpeg");

                    Donc effectivement tu avais raison, ce n'était pas le JS qui posait problème. Mille excuses :euh::p

                    Merci beaucoup pour ton aide kef_hin :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 septembre 2010 à 0:34:31

                      mais je vous en prie, je suis là pour ça ! non, en fait, pas du tout, mais ce que je dois faire me donne des migraines... donc... enfin vous savez...
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Contenu d'un input file interprété différemment sous IE

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown