7 votes

Cloner un objet FileList en JavaScript pour le téléchargement de fichiers ?

Très bien, voici ma situation. J'ai une classe JavaScript qui traite les soumissions de formulaires AJAX et d'autres requêtes synchrones et asynchrones connexes. Elle recueille des données, puis les place dans un stockage temporaire pour la requête, puis effectue la requête avec les données du stockage temporaire.

Par exemple :

  • L'utilisateur commence à construire une requête, met NOM et PRÉNOM dans le formulaire.
  • Ces données sont placées dans une variable objet SUBMITDATA.
  • Lorsque la demande est faite, ces données sont clonées dans une autre variable TEMPSUBMITDATA.
  • Une fois la demande terminée, les données utilisées pour effectuer la demande sont toujours disponibles (pour le débogage ou à d'autres fins).

Cela signifie que si deux requêtes sont en cours au même moment via le même objet, je peux toujours accéder aux données qui ont été utilisées pour effectuer ces requêtes.

Tout fonctionne comme prévu, jusqu'à ce que je veuille utiliser HTML5 FileList et FormData. Alors que je peux cloner des objets en JavaScript avec une relative facilité, je ne peux pas cloner FileList. Voici un exemple :

<html>
<head>
    <script type="text/javascript">
        // This method is used to clone data objects
        function clone(object){
            if(object==null || typeof(object)!=='object'){
                return object;
            }
            // This line throws the error when FileList data is attempted to be cloned
            var tmp=object.constructor();
            for(var key in object){
                tmp[key]=clone(object[key]);
            }
            return tmp;
        }

        // This is an example data storage
        var submitData=new Object();
        submitData['some-data']='abc';

        function uploader(files){

            submitData['my-files']=files;

            // This clones the object and leads to the error because of FileList
            var tempSubmitData=clone(submitData);

            // HERE WOULD THE ACTUAL FORM SUBMIT HAPPEN
            // THIS EXAMPLE IS SHOWN FOR EASIER READING OF
            // THE PROBLEM EXPLAINED ABOVE

        }
    </script>
</head>
<body>
    <input type="file" name="myfile" value="" onchange="uploader(this.files);"/>
</body>

Cela m'amène à ma question : puis-je - du moins - cloner ce type de données d'une manière quelconque afin de pouvoir les stocker jusqu'à ce que la demande soit terminée ? Ou est-ce que le seul moyen est de créer un nouvel objet à chaque fois ?

La solution du nouvel objet n'est pas bonne pour moi puisque ma classe fonctionne comme une application séparée, elle a un journal et d'autres données qui sont utiles pour le suivi des demandes plus tard et cela fonctionne très bien dans tous les cas - jusqu'à maintenant où je suis tombé sur l'utilisation de HTML5 FileList et FormData.

Toute aide serait appréciée !

3voto

Astaroth Points 685

Si vous utilisez jQuery vous pouvez utiliser le extend pour cloner un objet comme celui-ci.

var clonedObject = $.extend(true,{},yourObject);

Si ce n'est pas le cas, vous pouvez utiliser dans ce cas la fonction native Object.create()

var clonedObject = Object.create(yourObject);

Le dernier n'est pas une copie (mais un vide avec l'objet propriétés y fonctions de la première en tant que partie de son prototype, si je ne me trompe pas), mais c'est similaire et je pense que cela pourrait fonctionner pour vous dans ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X