Passer enctype à un formulaire en DOM pour Internet Explorer

Le Document Object Model (ou DOM) est une recommandation du W3C qui décrit une interface indépendante de tout langage de programmation et de toute plate-forme, permettant à des programmes informatiques et à des scripts d’accéder ou de mettre à jour le contenu, la structure ou le style de documents. Le document peut ensuite être traité et les résultats de ces traitements peuvent être réincorporés dans le document tel qu’il sera présenté. Source Wikipedia.

En résumé, cela permet de jouer sur les éléments HTML d’un page. Prenons un exemple, celui sur lequel on travaille actuellement. On a un formulaire d’ajout de produit dans une interface d’administration web. On a un champ “file” qui me permet d’attacher une image au produit.

Formulaire DOM

Eh bien grâce au DOM et à Javascript, sur le clic du lien “Fichier supplémentaire”, on fait apparaitre les mêmes types de champs (on modifie l’arbre DOM) afin de pouvoir attacher un nombre illimité de fichiers, ceci sans rechargement de page puisque tout se passe “côté client”, c’est à dire sur le navigateur de l’internaute.

Formulaire DOM 2

Après cette longue introduction, venons en au problème. Il n’y a pas beaucoup de sources à propos de ce bug sur internet, d’où la création de ce billet. Le problème se situe dans la création de formulaire grâce au DOM et sous Internet Explorer. Pour créer un formulaire le code peut être le suivant :

  1. // Création de l'objet formulaire
  2. var form = document.createElement('form');
  3. // Assignation des attributs
  4. form.setAttribute('id','form_1');
  5. form.setAttribute('action','page_action.php');
  6. form.setAttribute('method','post');
  7. // Création de l'objet fieldset
  8. fieldset = document.createElement('fieldset');
  9. // Ajoute le nœud fieldset au parent form
  10. form.appendChild(fieldset);

Maintenant si on veut transférer des fichiers via ce formulaire (upload grâce à input file), on doit créer un input de ce genre :

  1. // Création de l'élément input
  2. input_fichier = document.createElement('input');
  3. input_fichier .setAttribute('type','file');
  4. input_fichier.setAttribute('name','fichier[]');

Mais il faut aussi ajouter l’encodage du formulaire, spécifiant un échange de données :

  1. form.setAttribute('enctype','multipart/form-data');

Sous Firefox tout va bien, le problème vient d’un bug d’Internet Explorer (qui a dit encore ?) qui ignore tout simplement l’encodage attribué ci-avant.

La solution ?

Coupler à l’attribut enctype l’attribut encoding de la manière suivante :

  1. form.setAttribute('enctype','multipart/form-data');
  2. form.setAttribute('encoding','multipart/form-data');

Dorénavant IE et Firefox prendront en compte l’encodage du formulaire et vos fichiers seront correctement “postés” vers votre page de traitements.

Articles en relation

12 Responses to “Passer enctype à un formulaire en DOM pour Internet Explorer”

  1. Lhawsa Khukri Says:

    Merci Cyril pour ce petit tuyau qui je pense me sera fort utile d’ici un mois ou deux. :)

  2. Toufikcom Says:

    Merci , j’ai vraiment cherché bcq cette astuce, merci encore

  3. Cyril Lopez Says:

    Yep, super ça en était le but !

  4. Scrubs Says:

    Heureusement que je suis tombé sur cette page, sinon j’allait m’arracher les cheveux :-)

    Merci por le tuyau

  5. Cyril Lopez Says:

    De nada ! ;)

  6. Rémy Théroux Says:

    Merci pour cette astuce, ce n’est pas grand chose mais il faut la connaître. Je suis en train de développer un prototype pour proposer des téléchargement exactement comme tu l’expliques et ca ne marchait pas sous ie
    MERCI 1000 fois

  7. Hannibal Says:

    Merci grandement pour l’astuce. Un de mes clients a besoin d’un admin “facile à comprendre”, et cette astuce va bien me servir.

    J’ai remarqué un soucis du même type, je ne sais pas si tu as la solution, mais moi j’en ai une qui marche… pour ceux que ça intéresse : on ne peut pas non plus mettre d’événement par cette méthode sur IE.Les onclick etc ne marche pas.

    Il faut alors, au lieu de mettre monobjet.setAttribute(’onclick’,fonction_click()); , préféré monobjet.onclick = fonction_client(); . Cela permet de contourner le problème, et on n’y pense pas toujours ;)

    Et encore merci pour le tuyau !

  8. Cyril Lopez Says:

    Oui la réponse est dans ton interrogation, onclick est un événement et non un attribut ;)
    Tu peux aussi avoir :
    monObjet.onclick = function() {
    return false;
    }

  9. Aurelien Says:

    Merci
    dommage que je n’ai pas trouvé cette page avant
    cela fait 2 semaines que je m’arrachais les cheveux
    Encore un grand merci à ces abrutis de Microsoft

  10. frollon Says:

    thx ;)

  11. Emmanuel Says:

    Merci beaucoup de l’astuce, ce ce que je cherchais… ;)

  12. Cyril Lopez Says:

    Cool je vois que ça sert à des gens ;)

Laisser un commentaire