Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
J'upload une image dans un dossier temporaire. A partir de celle ci, je créé une miniature et une image de taille moyenne. Dans un deuxième de temps je récupère la valeur de l'identifiant qui est auto-incrémenté. Jusque là je n'ai pas de problème.
Je souhaite donc déplacer mon image dans le dossier "archives" et la renommer avec cet identifiant que je viens de récupérer.
Voici l'élément file de mon formulaire :
// Champ upload "nomFichier" $nomFichier = new Zend_Form_Element_File("nomFichier"); $nomFichier->setLabel("Fichier"); $nomFichier->setRequired(true); $nomFichier->setDestination("/home/jbunelcr/www/public/photos/tmp"); $nomFichier->setMaxFileSize(102400); $nomFichier->setDecorators(array('Composite')); $this->addElement($nomFichier);
Voici le code de mon controller :
// Création d'un upplet vide $photo = $this->_photoTable->createRow(); // Création du formulaire et déclaration des paramètres généraux $form = new My_Form_Photo(); $form ->setAction($this->view->link('photo', 'edit', null, '', 'default', !$isUpdated)) ->setMethod("post") ->setEnctype(Zend_Form::ENCTYPE_MULTIPART) ->setDefaults($photo->toArray()); // if($this->getRequest()->isPost() && $form->isValid($_POST)) { // Retrait des informations depuis les données en post // et ajout dans le modèle $values = $form->getValues(); $photo->setFromArray(array_intersect_key($values, $photo->toArray())); $constantes = Zend_Registry::get("constantes"); $location = $form->nomFichier->getFileName(); $mimeType = $form->nomFichier->getTypeMime(); $photo->save(); $lastId = $this->_photoTable->getAdapter()->lastInsertId(); // Traitement du fichier uploadé dans le fichier temp $visuel = My_ImageFactory::factory($location); $nomVisuel = $photo->idPhoto.$visuel->makeExtension(); //IMAGE ICONE $visuel->redimensionner($constantes["largeur_mini"], $constantes["rep_photo_mini"].$nomVisuel); //IMAGE WEB $visuel->redimensionner($constantes["largeur_web"], $constantes["rep_photo_web"].$nomVisuel); $dest = $constantes["rep_photo_archive"].$nomVisuel; $photo->nomFichier = $nomVisuel; $photo->typeMime = $mimeType; // Redirection vers la liste des familles //$this->_redirect("/lister-les-photos-page-1"); // Sauvegarde des données $photo->save(); }
J'ai besoin d'un coup de main svp.
Hors ligne
j'avoue que je ne comprends pas
peux tu utiliser le bb code [ code ]
pour qu'on puisse lire clairement
et tu fais
$photo->nomFichier = $nomVisuel
pourquoi tu fais pas
$photo->nomFichier = '/mon/dossier/que/j'/aime/bien/mon.nom.de.fichier'
je ne comprends pas où est ton problème.
A+JYT
Hors ligne
En fait j'upload mon image dans un dossier temporaire ("/home/jbunelcr/www/public/photos/tmp") :
// Champ upload "nomFichier" $nomFichier = new Zend_Form_Element_File("nomFichier"); $nomFichier->setLabel("Fichier"); $nomFichier->setRequired(true); $nomFichier->setDestination("/home/jbunelcr/www/public/photos/tmp"); $nomFichier->setMaxFileSize(102400); $nomFichier->setDecorators(array('Composite')); $this->addElement($nomFichier);
Ensuite dans mon controller, je créé un row vide ($this->_photoTable est un objet Zend_Db_Table)
// Création d'un upplet vide $photo = $this->_photoTable->createRow();
Ensuite
// Création du formulaire et déclaration des paramètres généraux $form = new My_Form_Photo(); $form ->setAction($this->view->link('photo', 'edit', null, '', 'default', !$isUpdated)) ->setMethod("post") ->setEnctype(Zend_Form::ENCTYPE_MULTIPART) ->setDefaults($photo->toArray()); if($this->getRequest()->isPost() && $form->isValid($_POST)) { // Retrait des informations depuis les données en post // et ajout dans le modèle $values = $form->getValues(); $photo->setFromArray(array_intersect_key($values, $photo->toArray())); $constantes = Zend_Registry::get("constantes"); $location = $form->nomFichier->getFileName(); $mimeType = $form->nomFichier->getTypeMime(); // Je fais une première sauvegarde des premières informations $photo->save(); // Je récupère le dernière identifiant $lastId = $this->_photoTable->getAdapter()->lastInsertId(); // Traitement du fichier uploadé dans le fichier temp $visuel = My_ImageFactory::factory($location); $nomVisuel = $lastId.$visuel->makeExtension(); //Création d'une image miniature a partir du dossier temporaire $visuel->redimensionner($constantes["largeur_mini"], $constantes["rep_photo_mini"].$nomVisuel); //Création d'une image intermédiaire a partir du dossier temporaire $visuel->redimensionner($constantes["largeur_web"], $constantes["rep_photo_web"].$nomVisuel); //A partir de là je souhaite mettre mon image qui est dans le dossier temporaire spécifié dans le setDestination ("/home/jbunelcr/www/public/photos/tmp") dans le dossier "/home/jbunelcr/www/public/photos/archives" tout en la renommant avec $nomVisuel au lieu qu'elle prenne le meme nom que celle de l'image d'origine qui sur le PC du client. $dest = $constantes["rep_photo_archive"].$nomVisuel; // Correspond à la colonne nomFichier de la table photo $photo->nomFichier = $nomVisuel; // Correspond à la colonne typeMime de la table photo $photo->typeMime = $mimeType; // Redirection vers la liste des familles //$this->_redirect("/lister-les-photos-page-1"); // Sauvegarde des données $photo->save(); }
Je souhaite mettre mon image qui est dans le dossier temporaire spécifié dans le setDestination ("/home/jbunelcr/www/public/photos/tmp") dans le dossier "/home/jbunelcr/www/public/photos/archives" tout en la renommant avec $nomVisuel au lieu qu'elle prenne le même nom que celle de l'image d'origine qui sur le PC du client.
J'espére que je suis plus clair.
;-)
Hors ligne
jbunel a écrit:
En fait j'upload mon image dans un dossier temporaire ("/home/jbunelcr/www/public/photos/tmp") :
Code:
// Champ upload "nomFichier" $nomFichier = new Zend_Form_Element_File("nomFichier"); $nomFichier->setLabel("Fichier"); $nomFichier->setRequired(true); $nomFichier->setDestination("/home/jbunelcr/www/public/photos/tmp"); $nomFichier->setMaxFileSize(102400); $nomFichier->setDecorators(array('Composite')); $this->addElement($nomFichier);Ensuite dans mon controller, je créé un row vide ($this->_photoTable est un objet Zend_Db_Table)
Code:
// Création d'un upplet vide $photo = $this->_photoTable->createRow();Ensuite
Code:
// Création du formulaire et déclaration des paramètres généraux $form = new My_Form_Photo(); $form ->setAction($this->view->link('photo', 'edit', null, '', 'default', !$isUpdated)) ->setMethod("post") ->setEnctype(Zend_Form::ENCTYPE_MULTIPART) ->setDefaults($photo->toArray()); if($this->getRequest()->isPost() && $form->isValid($_POST)) { // Retrait des informations depuis les données en post // et ajout dans le modèle $values = $form->getValues(); $photo->setFromArray(array_intersect_key($values, $photo->toArray())); $constantes = Zend_Registry::get("constantes"); $location = $form->nomFichier->getFileName(); $mimeType = $form->nomFichier->getTypeMime(); // Je fais une première sauvegarde des premières informations $photo->save(); // Je récupère le dernière identifiant $lastId = $this->_photoTable->getAdapter()->lastInsertId(); // Traitement du fichier uploadé dans le fichier temp $visuel = My_ImageFactory::factory($location); $nomVisuel = $lastId.$visuel->makeExtension(); //Création d'une image miniature a partir du dossier temporaire $visuel->redimensionner($constantes["largeur_mini"], $constantes["rep_photo_mini"].$nomVisuel); //Création d'une image intermédiaire a partir du dossier temporaire $visuel->redimensionner($constantes["largeur_web"], $constantes["rep_photo_web"].$nomVisuel); //A partir de là je souhaite mettre mon image qui est dans le dossier temporaire spécifié dans le setDestination ("/home/jbunelcr/www/public/photos/tmp") dans le dossier "/home/jbunelcr/www/public/photos/archives" tout en la renommant avec $nomVisuel au lieu qu'elle prenne le meme nom que celle de l'image d'origine qui sur le PC du client. $dest = $constantes["rep_photo_archive"].$nomVisuel; // Correspond à la colonne nomFichier de la table photo $photo->nomFichier = $nomVisuel; // Correspond à la colonne typeMime de la table photo $photo->typeMime = $mimeType; // Redirection vers la liste des familles //$this->_redirect("/lister-les-photos-page-1"); // Sauvegarde des données $photo->save(); }Je souhaite mettre mon image qui est dans le dossier temporaire spécifié dans le setDestination ("/home/jbunelcr/www/public/photos/tmp") dans le dossier "/home/jbunelcr/www/public/photos/archives" tout en la renommant avec $nomVisuel au lieu qu'elle prenne le même nom que celle de l'image d'origine qui sur le PC du client.
J'espére que je suis plus clair.
;-)
c'est bien ce que je dis pourquoi tu ne lui donne pas tout simplement le nom que tu veux
$photo->nomFichier = $dest;
j'avoue franchement ne pas voir où il y a un problème.
A+JYT
Hors ligne
$photo est un objet row. Le fait de faire "$photo->nomFichier = $dest;" correspond à écrire dans la base, le nom complet du fichier avec le path dans la colonne "nomFichier" qui serait "/home/jbunelcr/www/public/photos/archves/nom.de.la.photo"
Alors que le fichier lui est toujours dans le dossier "/home/jbunelcr/www/public/photos/temp".
Désolé j'ai un peu de mal à me faire comprendre.
Cordialement
Julien
Hors ligne
où écris tu ton fichier à quelle instruction ???
c'est la que tu fixe le nom du fichier
Hors ligne
Hello,
Je ne vois aucun appel à la méthode receive() donc ton fichier ne doit pas être à l'endroit prévu ensuite tu as peut-être le filtre Rename qui peut t'aider (je dis bien peut-être )
A+
Hors ligne
Bonjour,
C'est l'instruction ci dessous (qui se trouve dans ma classe de formulaire) qui envoi mon fichier dans le dossier temporaire mais à aucun moment je ne décide du nom du fichier.
$nomFichier->setDestination("/home/jbunelcr/www/public/photos/tmp");
Je récupére la valeur de l'auto-increment une fois le fichier uploadé. Je souhaite nommé le fichier avec cette valeur.
Pour le filtre 'rename', je ne sais pas comment l'utiliser dans mon controller. Je ne sais d'ailleurs pas si je peux !
J'espère que je suis plus clair...
Julien
Hors ligne
Bonjour,
J'suis en pleine création d'une classe d'upload de fichiers. J'ai réussi à renommer le fichier avec le nom que je souhaite, en passant comme proposé ci-dessus par le filtre rename.
$this->adapter = new Zend_File_Transfer_Adapter_Http(); ... $rootPath = substr($_SERVER['SCRIPT_FILENAME'],0,strrpos($_SERVER['SCRIPT_FILENAME'],'/admin/')).$this->directory.'/'; ... $newNameSave = time().'_'.$this->clean($file['name']); $this->adapter->addFilter('Rename', $rootPath.$newNameSave); ... if (!$this->adapter->isValid($file)) {} try{ $this->adapter->receive($file); } catch (Zend_File_Transfer_Exception $e) {}
Je ne mets pas de validateurs ou de filtres via Zend Form car je gère tout dans ma classe (je configure juste un .ini). Donc en gros je fais appel à ce code juste après ma validation de mon formulaire :
if ($form->isValid($formDatas)) { //traitement upload avec ma classe }
Voilà en gros, je ne sais pas si ça va t'aider.
Hors ligne
Hello,
Cette instruction dit juste où allez mais ne fait aucun travail. Regardes bien l'exemple : http://framework.zend.com/manual/en/zen … ments.file :
"After the form is validated successfully, you must receive the file to store it in the final destination using receive(). Additionally you can determinate the final location using getFileName()"
A+
Hors ligne
Je ne peux pas changer le nom du fichier, ni l'endroit où le fichier doit aller au final. La méthode getFileName() permet de connaitre l'endroit final où sera stocké le fichier mais pas de le déterminer.
Je n'arrive vraiment pas à utiliser le filtre Rename dans le controller. Comment puis-je attribuer le filtre 'rename' sur mon Zend_Form_Element_File a partir du controller ?
Julien
Dernière modification par jbunel (20-04-2009 17:52:56)
Hors ligne
J'ai essayé d'autre façon de faire mon upload mais rien à faire.
// Récupération de l'auto-increment $lastId = $this->_photoTable->getAdapter()->lastInsertId(); //////////////////////////////////////////////////////////// //////////////// //////////////// NOUVEAU TRAITEMENT //////////////// //////////////////////////////////////////////////////////// foreach ($form->nomFichier->getFileInfo() as $info) { $name = $info['name']; $ext = $this->_findexts($info['name']); $fileName = $lastId.".".$ext; $tmpName = $info['tmp_name']; } $form->nomFichier->addFilter('Rename', array('source' => '/home/jbunelcr/www/public/photos/tmp/'.$tmpName, 'target' => '/home/jbunelcr/www/public/photos/archives/'.$fileName, 'overwrite' => true)); $form->nomFichier->receive();
J'ai vraiment besoin d'aide !!!
Un coup de main serait vraiment le bienvenu...
Julien
Hors ligne
Salut,
Si tu créées ton champ ainsi :
$form->addElement('file', 'tree', array( 'label' => 'Tree XML', 'required' => true, 'destination' => 'C:\...', 'description' => 'File description', 'validators' => array( 'Count' => array(false, 1), 'Size' => array(false, 102400), 'Extension' => array(false,'xml') ) ));
Et que tu les récupéres comme ça dans ton contrôleur :
public function indexAction() { $form = $model->getForm(); if ( $this->getRequest()->isPost() ) { if ( $form->isValid($_POST) ) { $form->getElement('tree')->receive(); return; } } $this->view->assign('form', $form); return; }
Le fichier sera bien téléchargé dans le répertoire spécifié par le paramètre "destination" du champ nouvellement créé
Hors ligne
En fait le problème n'est pas de l'uploadé dans le bon dossier, c'est un problème de nom de fichier.
Je souhaite récupérer l'extension du fichier et ensuite le renommer avec l'auto-increment que je récupére ($lastId).
Chose que je n'arrive pas à faire.
Encore un dernier coup de main pour ça svp...
Hors ligne
Personne n'a une idée ? Comment puis procéder pour renommer ??
Le code ci dessous ne fonctionne pas :
// Récupération de l'auto-increment $lastId = $this->_photoTable->getAdapter()->lastInsertId(); //////////////////////////////////////////////////////////// //////////////// //////////////// NOUVEAU TRAITEMENT //////////////// //////////////////////////////////////////////////////////// foreach ($form->nomFichier->getFileInfo() as $info) { $name = $info['name']; $ext = $this->_findexts($info['name']); $fileName = $lastId.".".$ext; $tmpName = $info['tmp_name']; } $form->nomFichier->addFilter('Rename', array('source' => '/home/jbunelcr/www/public/photos/tmp/'.$tmpName, 'target' => '/home/jbunelcr/www/public/photos/archives/'.$fileName, 'overwrite' => true)); $form->nomFichier->receive();
Hors ligne
Essaye ça, chez moi j'ai réussi à le faire fonctionner comme ceci :
// Récupération de l'auto-increment $adapter = new Zend_File_Transfer_Adapter_Http(); foreach ($adapter->getFileInfo() as $file => $info) { $name = $info['name']; $ext = $this->_findexts($info['name']); $fileName = $lastId.".".$ext; $tmpName = $info['tmp_name']; $adapter->addFilter('Rename', array('source' => '/home/jbunelcr/www/public/photos/tmp/'.$tmpName, 'target' => '/home/jbunelcr/www/public/photos/archives/'.$fileName, overwrite' => true)); $adapter->receive($file); }
Dernière modification par Stormfaint (21-04-2009 14:44:17)
Hors ligne
Le code suivant ne fonctionne pas chez moi.
// Récupération de l'auto-increment $adapter = new Zend_File_Transfer_Adapter_Http(); foreach ($adapter->getFileInfo() as $file => $info) { $name = $info['name']; $ext = $this->_findexts($info['name']); $fileName = $lastId.".".$ext; $tmpName = $info['tmp_name']; $adapter->addFilter('Rename', array('source' => '/home/jbunelcr/www/public/photos/tmp/'.$tmpName, 'target' => '/home/jbunelcr/www/public/photos/archives/'.$fileName, overwrite' => true)); $adapter->receive($file); }
Je ne sais pas de quoi cela peut venir.
Si quelqu'un à une idée...
Hors ligne
Bonjour,
Il y a une chose que je ne comprends pas.
Il m'est impossible d'ajouter un filtre à mon Zend_Element_File du côté de mon controller.
Lorsque je fais (class My_Form_Photo extends Zend_Form) :
// Champ upload "nomFichier" $nomFichier = new Zend_Form_Element_File("nomFichier"); $nomFichier->setLabel("Fichier"); $nomFichier->setRequired(true); $nomFichier->setDestination("/home/jbunelcr/www/public/photos/archives"); $nomFichier->setMaxFileSize(102400); $nomFichier->setDecorators(array('Composite')); $nomFichier->addFilter('Rename', array( 'target' => '/home/jbunelcr/www/public/photos/archives/'.$nextId, 'overwrite' => true)); $this->addElement($nomFichier);
Masi que je fais ce code ci dessous dans mon controlleur ne marche pas :
$form->nomFichier->addFilter('Rename', array( 'target' => '/home/jbunelcr/www/public/photos/archives/'.$nextId, 'overwrite' => true)); $this->addElement($nomFichier);
Encore un peu d'aide et ça devrait être bon....
Hors ligne
Je reviens sur ce que j'ai dis dans le post d'avant. L'ajout de filtre peut se faire dans le controlleur.
Par contre j'ai une dernière question comment peut-on faire pour attribuer l'extension au nouveau nom dans le fitre 'rename' alors que tant que le fichier n'est pas reçu on ne peux pas connaitre son extension ?
Hors ligne
Via $info['type'] dans ton exemple, où tu récupères le MimeType (ne pas faire via le nom ($info['name']), car cela peut être erroné).
Sinon as tu des messages d'erreurs ou exécution normale mais tu ne retrouves simplement pas ton fichier sur le serveur ?
Il faut bien que ton dossier de destination soit disponible en écriture :
is_writable($root)
Hors ligne
Salut, moi j'aimerais avoir une aperçu de ta fonction qui permet de redimensionner tes images et de la duppliquer lors de l'upload, en fait, un image resizer lors de l'upload des fichiers
Hors ligne
Salut,
j'ai fait un truc du genre aussi où je m'étais bien cassé les dents mais là ça marche.
Dans mon form
$file = new Zend_Form_Element_File('photo'); $file->setLabel("Image :"); $file->addValidator('Size', false, 1024000); $file->addValidator('Count', false, 1); $file->setMaxFileSize(1024000); $file->setValueDisabled(true); $file->setDecorators($this->_fileDecorators);
Dans le controlleur
$membre = $this->_membreTable->createRow(); $form = new App_Form_Membre(); $url = $this->view->url( array( 'controller' => 'index', 'action' => 'edit', 'module' => 'default' ), null); $form->setAction($url); $form->setMethod('post'); $form->setDefaults($membre->toArray()); if ($this->getRequest()->isPost() && $form->isValid($_POST)) { $adapterImgUrl = $form->photo->getTransferAdapter(); //UPLOAD ET REDIMENSIONNEMENT foreach($adapterImgUrl->getFileInfo() as $file=>$info) { if ($info['name']) { $name = $info['name']; //$name = $adapterImgUrl->getFileName('image'); $ext = substr(strrchr($name,'.'),1); $fileName = Zend_Date::now()->toString('ddMMyyyy_HHmmss') . '.' . $ext; $tmpName = $info['tmp_name']; $path = 'le/chemin/de/destination/de/ta/photo'; $filterFileName = new Zend_Filter_File_Rename(array( 'target'=>$path . $fileName, 'overwrite'=>true)); $adapterImgUrl->addFilters(array($filterFileName)); try { // upload received file(s) $adapterImgUrl->receive(); } catch (Zend_File_Transfer_Exception $e) { $e->getMessage(); } //redimensionnement $this->_helper->thumb($path . $fileName, 150, 150); } } } .....
Si ça peut t'aider
Hors ligne
jbunel a écrit:
Je reviens sur ce que j'ai dis dans le post d'avant. L'ajout de filtre peut se faire dans le controlleur.
Par contre j'ai une dernière question comment peut-on faire pour attribuer l'extension au nouveau nom dans le fitre 'rename' alors que tant que le fichier n'est pas reçu on ne peux pas connaitre son extension ?
si cela pourrait t'aider
if ($this->_request->isPost()) { $formData = $this->_request->getPost(); if ($form->isValid($formData)) { /* Uploading Document File on Server */ $upload = new Zend_File_Transfer_Adapter_Http(); $upload->setDestination('images/products_large/'); /* New name and path of the file uploaded*/ $renameFile = $prod_id.'.jpg'; $fullFilePath = 'images/products_large/'.$renameFile; /* Rename uploaded file using Zend Framework */ $upload->addFilter('Rename', array('target'=>$fullFilePath, 'overwrite'=>true)); try { // upload received file(s) $upload->receive(); } catch (Zend_File_Transfer_Exception $e) { $e->getMessage(); } ...
il faut avant cela que tu récupères dans $prod_id le dernier produit ajouté
Hors ligne
Voici comment un bout de mon code
if ($this->_request->isPost()) { $formdata=$this->_request->getPost(); if ($form->isValid($formdata)){ //Réservation d'un nouvel enregistrement temporaire dans la table Documents //à partir du Type de Document $form->fichier->receive(); //$oldname, $extension contient le nom et l'ext. du fichier temporaire $oldname=$form->fichier->getFileName(null,true); $extension = strrchr($oldname, '.'); //je récupère l'ID de l'utilsateur pour le stocker dans la bd $auth = Zend_Auth::getInstance(); // Je remplis un tableau $data avec les données de mon enregistrements $data = array('doctype'=>$formdata['doctype'], 'description'=>$formdata['description'], 'ext'=>$extension, 'user_id'=>$auth->getIdentity()->user_id, 'indice'=>$formdata['indice'], 'doc_ref'=>$formdata['doc_ref']); // Je rentre les données dans la base, 5données temporaires $tempdoc = new mDocuments(); $tempdocdata=$tempdoc->nvTempDoc($data); // si l'enregistrement temporaire n'est pas crée dans ma base, j'efface le fichier temporaire if ($tempdocdata==null) { unlink($oldname); $this->_forward('code','error','default',array('n'=>1600)); }else { // si l'enregistrement temporaire est crée dans ma base, je récupère l'ID du fichier if ($formdata['indice']!='') { $ind='-'.$formdata['indice']; } $rootdir est le chemin de mon appli $rootdir = Zend_Registry::get('rootdir'); //$newname est le nouveau nom du fichier avec le chemein complet rootdir\upload\nouveau nom // Le nouveau nom est généré à partir des données de l'enregistrement temporaire de la base ID+Indice+Extension $newname=$rootdir.'\upload\\'.'\\'.$tempdocdata->id.$ind.$extension; try { //renommer le fichier rename($oldname,$newname); //maj de la bd $tempdoc->updateTempDoc($tempdocdata->id); //Changer Redirection vers liste des documents du type DocType $this->_redirect('/documents/consultation/categories'); }catch (Exception $e) { try { $tempdoc->deleteTempDoc($tempdocdata->id); unlink($newname); unlink($oldname); } catch (Exception $e){ ; } $this->_forward('code','error','default',array('n'=>1601)); } } }else { $this->view->message='Veuillez vérifier les données que vous avez fournies.'; $form->populate($formdata); } } $this->view->form=$form;
Hors ligne
Pages: 1