Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 07-01-2009 15:29:27

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

[Résolu]Uploader plusieurs fichiers en même temps

Bien le bonjour à tous!

Je reviens vous enquiquiner encore, avec l'upload de plusieurs fichiers simultanément.

Après avoir fait des recherches sur le net, j'ai compris qu'il fallait utiliser le javascript pour arriver à mes fins. Malheureusement, je n'y connais pas grand chose en javascript, voir rien du tout... Donc j'ai trouvé le code d'un monsieur qui faisait exactement ce que je voulais, mais le problème vient ensuite dans la retranscription du code avec le Zend framework... Puisqu'avec le Zend_Form_Element_File, je n'arrive pas à récupérer les fichiers que j'ai 'uploadé', et il me retourne une erreur :

Code:

    * The file '' could not be found
    * The file '' was not found

Et mon upload de fichier me donne ceci a chaque fois que je sélectionne un fichier:

Code:

Files :
//code généré par le javascript
Nom_du_fichier.extension [delete]

Logique, puisque du coup, rien n'est inscrit dans mon 'label' (le bout de texte avant le "parcourir...").

Donc je voulais savoir si je pouvais continuer dans cette voix, ou au contraire s'il existait quelque chose avec Zend pour pouvoir le faire plus simplement?

Dernière modification par Chim (13-01-2009 15:00:56)

Hors ligne

 

#2 07-01-2009 16:41:37

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Résolu]Uploader plusieurs fichiers en même temps

non tu n'a pas besoin de javascript
un form avec un multipart et suffisant il suffit d'avoir plusieurs champs file dans le form
et côté serveur php le gère dans un tableau de fichiers

A+JYT

Hors ligne

 

#3 07-01-2009 17:07:48

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Re: [Résolu]Uploader plusieurs fichiers en même temps

Hmm Est-ce que je pourrais avoir un peu plus d'informations s'il vous plait? :$

Je suis désolé, j'y connais pas grand chose hmm

Au niveau du 'plusieurs champs file dans le form' je voudrais qu'il s'en affiche autant que ce que l'utilisateur veut en uploader...

Hors ligne

 

#4 07-01-2009 18:07:53

acharrex
Membre
Lieu: Suisse
Date d'inscription: 27-04-2008
Messages: 135

Re: [Résolu]Uploader plusieurs fichiers en même temps

En gros, tu voudrais créer un bouton "Ajouter un autre fichier" qui ajouterais automatiquement un champ FILE à ton formulaire ?

Hors ligne

 

#5 07-01-2009 18:10:10

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Re: [Résolu]Uploader plusieurs fichiers en même temps

Ouaip, et ensuite savoir comment le récupérer ensuite (j'imagine que ce serait dans un tableau...?)

Hors ligne

 

#6 07-01-2009 18:27:29

acharrex
Membre
Lieu: Suisse
Date d'inscription: 27-04-2008
Messages: 135

Re: [Résolu]Uploader plusieurs fichiers en même temps

En fait le problème c'est que si tu ne le fais qu'en Javascript (donc ajouter "dynamiquement" un champ FILE à ton formulaire), Zend_Form ne saura pas le gérer et générera des erreurs.

Donc il te faut, lors du POST de ton formulaire, ajouter dynamiquement un champ à ton Zend_Form afin que tu puisses l'utiliser dans tes traitements.

Mais bon le but est aussi de procéder par étape :
- Ajouter des champs FILE en Javascript
- Ajouter des champs à ton Zend_Form
- Traitement des champs

Es-tu à l'étape 1 ou est-ce que c'est ok ?

Pour info, tous les fichiers uploadés seront disponibles en PHP (après le POST du formulaire) dans le tableau $_FILES et pas $_POST.

Dernière modification par acharrex (07-01-2009 18:29:28)

Hors ligne

 

#7 07-01-2009 19:26:11

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Re: [Résolu]Uploader plusieurs fichiers en même temps

Hum je sens que je cerne le probleme de plus en plus, merci de votre aide wink

Sinon, pour la premiere etape, mon script ne fait que rajouter le nom des fichiers à uploader, donc je n'ai toujours qu'un seul champs FILE...

Hors ligne

 

#8 07-01-2009 22:19:41

Guillhomme
Membre
Date d'inscription: 09-10-2008
Messages: 102

Re: [Résolu]Uploader plusieurs fichiers en même temps

Tiens j'ai dut faire face a ce probleme, moi c'etait pour des textbox, a quelques differences pres ca doit etre la meme chose

Le code javascript :

Code:

i=0;
function addchamp() {
    var Obj = document.getElementById ( 'formress') ;
      if( Obj) {
   
    var pname=document.createElement("input");
pname.type="text";
pname.name="ressource_new"+i;
        Obj.appendChild( pname);
  i++;  
    
    }
      
}

C'est tout simple, je suis pas tres bon en javascript, j'imagine ca peut etre optimisé.

Hors ligne

 

#9 08-01-2009 09:40:28

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Re: [Résolu]Uploader plusieurs fichiers en même temps

Je te remercie pour ce bout de code, et j'imagine qu'il faut que je le mette dans ma vue? C'est-a-dire à mon ajouternews.phtml, ou directement dans mon layout? Je pensais plus à l'inclure juste avant de faire un echo de mon form...

Hors ligne

 

#10 08-01-2009 16:11:32

acharrex
Membre
Lieu: Suisse
Date d'inscription: 27-04-2008
Messages: 135

Re: [Résolu]Uploader plusieurs fichiers en même temps

Tu peux le mettre soit dans ta vue soit dans un script JS que tu appeleras dans le header de ta page (entre les balises <head>).

Et sur ton bouton "Ajouter un autre fichier" rajoute un évènement "onclick" dans lequel tu appeleras ta fonction "addchamp".

Hors ligne

 

#11 08-01-2009 17:47:01

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Re: [Résolu]Uploader plusieurs fichiers en même temps

Hmm je vais reprendre un peu pour vous montrer où j'en suis...

Mon ajouternews.phtml

Code:

<form name="form" action="<?= $this->escape($this->form->getAction() ?>"
    method="<?= $this->escape($this->form->getMethod() ?>">
    <?php
    echo $this->form->id;
    echo $this->form->titre;
    echo $this->form->statut;
    echo $this->form->section;
    echo $this->form->news;
    echo $this->form->file;
    ?>
    <input type="button" name="coco" value="Ajouter un fichier" onClick="javascript:addchamp()">
    
    <?php
    
    echo $this->form->submit;


    ?></form>

Edit: J'ai aussi oublié mon addchamp() (enfin celui de Guillhomme) que voila :

Code:

<script language="JavaScript">
i=0;
function addchamp() {
    var Obj = document.getElementById ('form') ;
    if( Obj) {
   
    var pname=document.createElement("input");
    pname.type="file";
    pname.name="file"+i;
        Obj.appendChild( pname);
      i++;  
    
    }
      
}
   </script>

Mais la, ça ne marche pas non plus hmm

Donc j'ai loupé un truc quelque part, mais quoi??

Dernière modification par Chim (08-01-2009 17:50:56)

Hors ligne

 

#12 08-01-2009 18:02:11

acharrex
Membre
Lieu: Suisse
Date d'inscription: 27-04-2008
Messages: 135

Re: [Résolu]Uploader plusieurs fichiers en même temps

Code:

document.getElementById ('form') ;

recherche un élément portant comme attribut un id avec la valeur "form". Or cela n'est pas le cas dans ta vue.

Hors ligne

 

#13 09-01-2009 10:03:10

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Re: [Résolu]Uploader plusieurs fichiers en même temps

J'avais pas fait attention à cela merci wink

Mais ca ne marche toujours pas hmm

J'ai remplacé par :
    var Obj = document.getElementById ('file') ;

Et lorsque je clique sur mon bouton ajouter un fichier, rien ne se passe...

Est-ce qu'il y aurait un problème au niveau de l'appel de ma fonction, sur le onClick? Comment procède-t-on pour appeler une fonction en JS? onClick="javascript:addchamp()" ou tout simplement onClick="addchamp()" ?

Merci pour vos réponses

Hors ligne

 

#14 09-01-2009 11:42:18

Guillhomme
Membre
Date d'inscription: 09-10-2008
Messages: 102

Re: [Résolu]Uploader plusieurs fichiers en même temps

Je crois que les deux fonctionnent.
Si ce n'est pas encore fait, je te conseil grandement d'installer sous Firefox la barre Web Developper, t'as un bouton a droite qui te previent dès qu'une erreur javascript survient avec la ligne et un message pour le debuggage, tres pratique smile ( Firebug le fait peut etre aussi )

Hors ligne

 

#15 09-01-2009 12:09:26

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Re: [Résolu]Uploader plusieurs fichiers en même temps

Merci pour l'info, mais je n'ai aucune erreur notable -__-

Donc pour le moment j'ai fait une solution de secours en mettant 3 champs de type 'file' dans mon NewsForm, mais si l'utilisateur veut en uploader plus, eh bien je serais dans la ...... ^^

Hors ligne

 

#16 09-01-2009 13:01:35

acharrex
Membre
Lieu: Suisse
Date d'inscription: 27-04-2008
Messages: 135

Re: [Résolu]Uploader plusieurs fichiers en même temps

Je viens de tester et ce code ne semble pas poser de soucis (Firefox 3, IE 6/7) :

Code:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

    <head>
        <title>Add Field</title>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />

        <script type="text/javascript">
            
            var fileId = 0;
            
            function addField() {
            
                var container = document.getElementById('files');
                
                if ( container ) {
                
                    var input = document.createElement('input');
                    input.type = 'file';
                    input.name = 'file' + fileId;
                    
                    container.appendChild(input);
                    
                    fileId++;
                
                }
                
            }
        </script>

    </head>
    
    <body>
    
        <form action="" method="post" name="uploadForm">
        
            <div id="files">
                <input type="file" name="file" />
            </div>
            
            <input type="button" onclick="addField()" value="Add another file" />
        
        </form>
        
    </body>
    
</html>

Dernière modification par acharrex (09-01-2009 13:02:58)

Hors ligne

 

#17 09-01-2009 13:28:48

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Re: [Résolu]Uploader plusieurs fichiers en même temps

Je te remercie, j'avais pas le <div id="files"> , donc ça risquait pas de marcher..

Mais maintenant, pour récupérer les éléments uploadés, j'ai essayé ça:

Code:

                if (!$form->file->receive()) {
                    print "Error";
                } else {
                    print " Transfer Okey ! ";
                    $fichier = $form->file->getFileName('file');
                    $fichier1 = $form->file1->getFileName('file1');
                    $fichier2 = $form->file2->getFileName('file2');
                    $row->file = basename($fichier).",".basename($fichier1).",".basename($fichier2);
                }

Je pense bien que c 'est pas le top, mais je sais pas non plus comment pouvoir le récupérer?
A la base, ce code était pour mes 3 uploads de 'base'... Mais je vois pas comment l'implémenter différemment pour le moment...

Hors ligne

 

#18 09-01-2009 16:02:01

acharrex
Membre
Lieu: Suisse
Date d'inscription: 27-04-2008
Messages: 135

Re: [Résolu]Uploader plusieurs fichiers en même temps

Tu fais un "foreach" sur le tableau $_FILES et tu crées pour chacun des fichiers un champ dans Zend_Form :

Code:

<?php

foreach ( $_FILES as $file ) {
    // field creation
}

Hors ligne

 

#19 09-01-2009 16:57:07

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Re: [Résolu]Uploader plusieurs fichiers en même temps

Humm quelque chose me titille un peu... Pourquoi faire un champ pour chacun des fichiers uploadés? Je comprends pas comment je peux le faire, sachant que normalement quand j'appuierai sur Submit, il va prendre les infos avec le 'premier' formulaire non?

Hors ligne

 

#20 09-01-2009 17:26:39

acharrex
Membre
Lieu: Suisse
Date d'inscription: 27-04-2008
Messages: 135

Re: [Résolu]Uploader plusieurs fichiers en même temps

Non parce que dans ton contrôleur, tu testes d'abord si le formulaire a été envoyé puis si ses données sont valides.

En gros tu fais ça :

Code:

if ( $this->getRequest()->isPost() ) {
    
    if ( $form->isValid($_POST) ) {
        
        $model->saveData($form->getValues());
        
    }
    
}

Donc si tu crées ton formulaire après le "$this->getRequest()->isPost()" tu pourras lui ajouter tous tes champs FILE (créé dynamiquement en JS) et les récupérer grâce à la méthode "getValues()".

Dernière modification par acharrex (09-01-2009 17:27:24)

Hors ligne

 

#21 10-01-2009 12:11:25

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Re: [Résolu]Uploader plusieurs fichiers en même temps

Ok, je vois ce que tu veux dire, mais je sais pas comment le retranscrire en code >_<

J'ai essayé cela mais ça ne marche pas...

Code:

if ($this->_request->isPost()) {
            $formData = $this->_request->getPost();
            $formulaire = new NewsForm();
            $formulaire->addElement('file', 'file0');
            $formulaire->addElement('file', 'file1');
            if ($form->isValid($formData)) {

Je ne suis pas sûr qu'il faille faire comme ça, et je ne vois pas comment je pourrais le faire hmm

Et je comprends pas comment je peux lui dire qu'il faille en créer autant que ce que le script JS en a créé...

Un for certainement, mais après... Le trou noir...

Hors ligne

 

#22 10-01-2009 16:52:13

acharrex
Membre
Lieu: Suisse
Date d'inscription: 27-04-2008
Messages: 135

Re: [Résolu]Uploader plusieurs fichiers en même temps

Compliques-toi pas trop la vie.

Ton formulaire contiendra les champs "file0", "file1", "file2", "fileXXX" selon le nombre de fichiers que souhaite uploader l'utilisateur.

Donc après l'avoir envoyé, tu pourras récupérer dans ton contrôleur/modèle un tableau comme celui-ci :

Code:

Array
(
    [file0] => Array
        (
            [name] => file.docx
            [type] => application/vnd.openxmlformats-officedocument.wordprocessingml.document
            [tmp_name] => D:\xampp\tmp\php8124.tmp
            [error] => 0
            [size] => 477655
        )

    [file1] => Array
        (
            [name] => file.txt
            [type] => text/plain
            [tmp_name] => D:\xampp\tmp\php8164.tmp
            [error] => 0
            [size] => 172
        )

)

Ces données sont stockées dans le tableau superglobal $_FILES. Comme tu peux l'imaginer un simple foreach sur ce dernier te permettra de créer tes champs :

Code:

<?php

foreach ( $_FILES as $field => $file ) {
    $form->addElement("file", $field);
}

Ca te semble plus clair ?

Dernière modification par acharrex (10-01-2009 16:53:08)

Hors ligne

 

#23 10-01-2009 17:26:47

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Re: [Résolu]Uploader plusieurs fichiers en même temps

Bin ouais je savais bien qu'un foreach s'imposait, mais je ne savais pas comment le remplir... Merci a toi pour toutes ces explications wink J'éditerai si cela fonctionne!

Edit: Héhé, je sais pas si j'avais pensé à tout, parce que ça ne marche toujours pas...

Voila les erreurs transmises:

Code:

Notice: Undefined index: name in C:\wamp\www\zfmvc-projetIntra\library\Zend\File\Transfer\Adapter\Abstract.php on line 1147

Notice: Undefined index: tmp_name in C:\wamp\www\zfmvc-projetIntra\library\Zend\File\Transfer\Adapter\Abstract.php on line 577

Warning: Invalid argument supplied for foreach() in C:\wamp\www\zfmvc-projetIntra\library\Zend\Validate\File\Count.php on line 217

Notice: Undefined index: tmp_name in C:\wamp\www\zfmvc-projetIntra\library\Zend\File\Transfer\Adapter\Abstract.php on line 577

Notice: Undefined index: name in C:\wamp\www\zfmvc-projetIntra\library\Zend\Validate\File\Size.php on line 366

Notice: Undefined index: tmp_name in C:\wamp\www\zfmvc-projetIntra\library\Zend\File\Transfer\Adapter\Abstract.php on line 577

Notice: Undefined index: name in C:\wamp\www\zfmvc-projetIntra\library\Zend\Validate\File\Extension.php on line 198

Et voila le code qui va avec:

Code:

        if ($this->_request->isPost()) {
            $formData = $this->_request->getPost();
            foreach ( $_FILES as $field => $file ) {
                $form->addElement("file", $field);
            }
            if ($form->isValid($formData)) {
                $news = new News();
                $row = $news->createRow();

                if (!$form->file->receive()) {
                    print "Error";
                } else {
                    print " Transfer Okey ! ";
                    
                    $fichier = $form->file->getFileName();
                    $row->file = basename($fichier);
                }
            }

Dernière modification par Chim (10-01-2009 17:51:51)

Hors ligne

 

#24 12-01-2009 14:23:44

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Re: [Résolu]Uploader plusieurs fichiers en même temps

C'est bon j'ai réussi ! ^^ Merci a tous!

je vous met le code qui me permet d'uploader autant de fichiers que je veux ^^

Code:

if ($this->_request->isPost()) {
            $nbFile=0;
            $formData = $this->_request->getPost();
            foreach ( $_FILES as $field => $file ) {
                $form->addElement("file", $field);
                $nbFile++;
            }
            if ($form->isValid($formData)) {
                                $news = new News();
                $row = $news->createRow();
                if (!$form->file->receive()) {
                    print "Error";
                } else {
                    print " Transfer Okey ! ";

                    foreach ( $_FILES as $field => $file ) {
                        if(basename($field['name'])=="TEMP"){
                            $fichier_temp = $_FILES[$field]['tmp_name'];
                            $fichier = $_FILES[$field]['name'];
                            move_uploaded_file($fichier_temp,'C:/wamp/www/zfmvc-projetIntra/file/'.$fichier);
                        }
                    }
                    echo $nbFile;
                    Zend_debug::dump($_FILES);
                    if(basename($form->file->getFileName('file')!="TEMP")){
                        $fichier[] = $form->file->getFileName('file');
                        for($a=0;$a<$nbFile-1;$a++){
                            $file = 'file'.$a;
                            $fichier[] = $form->file->getFileName($file);

                        }
                    }
                    for($b=0;$b<count($fichier);$b++){
                        if($row->file != "TEMP" && basename($fichier[$b] != "TEMP")){
                            if(empty($row->file) && basename($fichier[$b])!="TEMP"){
                                $row->file = basename($fichier[$b]);
                            } else if(basename($fichier[$b])!="TEMP"){
                                $row->file = $row->file.','.basename($fichier[$b]);
                            }
                        }
                    }
                }
                $row->save();

C'est peut etre pas forcément parfait au niveau du code, mais au moins ça marche ^^ encore merci à tous ceux qui m'ont aidé ^^

Hors ligne

 

#25 13-01-2009 10:26:48

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Re: [Résolu]Uploader plusieurs fichiers en même temps

Bonjour tout le monde!

J'ai un dernier petit problème... Mon upload ne prend qu'à partir du deuxième fichier. Donc, lorsque j'upload un fichier, rien n'est uploadé dans mon répertoire... Et lorsque j'en upload 2 ou plus, le premier ne s'uploadera pas, alors qu'il sera par contre, inscrit dans la base... (j'entends par là le nom du fichier)

Et lorsque j'essaie le même code pour l'upload sur une vue, l'upload fonctionne niquel... Mais je ne pense pas que ce soit super au top de mettre un upload de fichier dans la vue hmm

Le code à l'appui est juste au dessus de ce post...

Si vous avez des pistes pour m'expliquer pourquoi il ne veut uploader qu'à partir du second fichier... Merci d'avance ^^

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages