Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'essaie depuis quelques jours de réaliser un upload de fichier à partir d'un formulaire, mais rien à faire ça ne marche pas.
Mon formulaire
<form id="upload_form" method="POST" action="<?php echo $this->url(array('controller'=>'X','action'=>'X'));?>"> ... <li> <label class="description">Photographie</label> <div> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> <input name="uploadedfile" type="file" /> </div> </li> ... </form>
Mon controller
$upload = new Zend_File_Transfer_Adapter_Http(); $upload->addValidator('FilesSize', false, array('min' => 100, 'max' => 10000, 'bytestring' => true)); $upload->addValidator('ImageSize', false, array('minwidth' => $largeur_mini, 'minheight' => $hauteur_mini, 'maxwidth' => $largeur_maxi, 'maxheight' => $hauteur_maxi)); ... if($input->isValid()) { ... Zend_Debug::dump($upload->getFileInfo()); $upload->setDestination($uploaddir);//->receive(); if ($upload->receive()) { echo "\n The file has been uploaded!"; } else { echo "\n The file has not been uploaded!"; //Zend_Debug::dump($upload); } ... }
Voici le message d'erreur que j'obtient :
array(0) { } The file has not been uploaded! The file '' exceeds the defined ini size
Je ne reçoit rien. C'est comme si je n'avais pas de fichier. J'utilise ZF 1.9.5. J'ai essayé avec un simple formulaire php (sans ZF) et ça marche sans problème.
Quelqu'un aurait-il une idée ?
Hors ligne
Mon action :
public function addAction() { $request = $this->getRequest(); $form = new Application_Form_AddProduit(); //formulaire d'ajout if ($this->getRequest()->isPost()) { if ($form->isValid($request->getPost())) { $upload = new Zend_File_Transfer_Adapter_Http(); $upload->setDestination(PUBLIC_PATH.'/images/produits/'); //chemin ou l'image sera placé try { // Upload du fichier reçu if($upload->receive()){ $produit = new Application_Model_Produit($form->getValues()); // crée le model Produit $produit->setImg($upload->getFileName($file = null, $path = false)); // récupère le nom de l'image (pour la bdd) $produitMapper = new Application_Model_ProduitMapper(); $produitMapper->save($produit); //enregistre le produit ds la base $form->reset(); //vide le formulaire } } catch (Zend_File_Transfer_Exception $e) { $e->getMessage(); } } } $this->view->form = $form; }
Mon form :
class Application_Form_AddProduit extends Zend_Form { public function init() { $this->setMethod('post') ->setAttrib('enctype', 'multipart/form-data'); // Nom $nom = $this->createElement('text', 'nom'); $nom->setLabel('Nom :') ->setRequired(true) ->addValidator('NotEmpty'); // Adresse $description = $this->createElement('textarea', 'description'); $description->setLabel('Description :') ->setAttribs(array( 'cols' => 25, 'rows' => 3 )) ->setRequired(true) ->addValidator('NotEmpty') ->addFilter('StripTags'); //Img $img = $this->createElement('file', 'img'); $img->setLabel('Image :') ->setRequired(true); // Prix $prix = $this->createElement('text', 'prix'); $prix->setLabel('Prix :') ->setRequired(true) ->addValidator('NotEmpty'); // Marque $marque = new Zend_Form_Element_Select('idMarque'); $marque->setLabel('Marque :'); $tableMarque = new Application_Model_MarqueMapper(); foreach($tableMarque->fetchAll() as $uneMarque){ $marque->addMultiOption($uneMarque->idMarque, $uneMarque->libelleMarque); } // Ajout des éléments au formulaire $this->addElement($nom) ->addElement($description) ->addElement($img) ->addElement($prix) ->addElement($marque) ->addElement('submit', 'ajouter', array('label' => 'Ajouter')); } }
Perso je fais comme ça et ça roule
Hors ligne
Hello,
Je dirais que tu envoies un fichier plus gros que tu n'es autorisé par ton php.ini
@+
Hors ligne
J'essaierai d'utiliser le formulaire, ça pourrait venir de là.
Je me pose une question en voyant votre façon de faire : est-on obliger de créer un formulaire avec Zend pour utiliser Zend_File_Transfer_Adapter_Http (ou toute technique permettant de récupérer $_FILES) ?
Sinon j'ai essayer avec une image qui fait 4KO, et mon php.ini est configuré par défaut à 2M.
Hors ligne
Re-Bonjour
Alors j'ai essayé en instanciant un Zend_Form et là.... ça marche NICKEL !
Bon c'est déjà ça.
Vous avez une idée du pourquoi ça marche pas avec un formulaire HTML ??
Parce que mon projet est déjà commencé et j'ai pas utilisé Zend_Form au début de peur d'être limité dans l'utilisation que je voulais en faire. Mais si j'ai encore d'autres surprise comme ça...
Hors ligne
ton <form> n'as pas l'attribut 'enctype=multipart/form-data'.
Sans cet attribut, pas d'upload possible
Hors ligne
Effectivement et Zend_Form l'ajoute automatiquement quand il contient un élément File.
Conclusion => utilisons Zend_Form sans modération
Hors ligne