2009-12-08 6 views
12

Je veux télécharger une image avec Zend Framework version 1.9.6. Le téléchargement fonctionne bien, mais je veux aussi quelques autres choses ... et je suis complètement coincé.Zend Framework: image upload

  • Les messages d'erreur pour ne pas télécharger une image ne s'afficheront pas.
  • Si un utilisateur ne saisit pas tous les champs requis mais a téléchargé une image, je veux afficher l'image téléchargée dans mon formulaire. Soit comme une image ou comme un lien vers l'image. Juste une forme de retour à l'utilisateur.
  • Je souhaite utiliser Zend_ Validate_ File_ IsImage. Mais ça ne semble rien faire.
  • Et enfin; Y at-il une fonctionnalité de renommage automatique?

Toutes les idées et suggestions sont les bienvenues. Je me bats depuis deux jours maintenant.

Ceux-ci sont simplifiées des extraits de code:

myform.ini

method = "post" 

elements.title.type = "text" 
elements.title.options.label = "Title" 
elements.title.options.attribs.size = 40 
elements.title.options.required = true 

elements.image.type = "file" 
elements.image.options.label = "Image" 
elements.image.options.validators.isimage.validator = "IsImage" 

elements.submit.type = "submit" 
elements.submit.options.label = "Save" 

TestController

<?php 
class Admin_TestController extends Zend_Controller_Action 
{ 
    public function testAction() 
    { 
    $config = new Zend_Config_Ini(MY_SECRET_PATH . 'myform.ini'); 
    $f = new Zend_Form($config); 

    if ($this->_request->isPost()) 
    { 
     $data = $this->_request->getPost(); 

     $imageElement = $f->getElement('image'); 
     $imageElement->receive(); 

     //$imageElement->getValue(); 

     if ($f->isValid($data)) 
     { 
     //save data 
     $this->_redirect('/admin'); 
     } 

     else 
     { 
     $f->populate($data); 
     } 
    } 

    $this->view->form = $f; 
    } 
} 
?> 

Mon point de vue echo juste est la variable 'forme'.

Répondre

19

D'abord, mettre cela au début de votre script:

error_reporting (E_ALL); // devrait afficher toutes les erreurs php

Je pense que les messages d'erreur sont absents de la forme parce que vous RE- remplissez le formulaire avant de l'afficher. Je pense que cela efface tous les messages d'erreur. Pour résoudre ce problème, supprimez cette partie:

else 
{ 
    $f->populate($data); 
} 

Pour afficher l'image téléchargée sous la forme, il suffit d'ajouter un div à votre modèle de vue, comme ceci:

<div style="float:right"><?=$this->image?></div> 

Si l'image téléchargée ok, puis Remplissez $ view-> image avec une balise img. En ce qui concerne le re-nommage automatique, non, ce n'est pas intégré, mais c'est très facile. Je vais vous montrer comment ci-dessous. Voilà comment je gérer mes téléchargements d'image:

$form = new Zend_Form(); 
$form->setEnctype(Zend_Form::ENCTYPE_MULTIPART); 

$image = new Zend_Form_Element_File('image'); 
$image->setLabel('Upload an image:') 
     ->setDestination($config->paths->upload) 
     ->setRequired(true) 
     ->setMaxFileSize(10240000) // limits the filesize on the client side 
     ->setDescription('Click Browse and click on the image file you would like to upload'); 
$image->addValidator('Count', false, 1);    // ensure only 1 file 
$image->addValidator('Size', false, 10240000);   // limit to 10 meg 
$image->addValidator('Extension', false, 'jpg,jpeg,png,gif');// only JPEG, PNG, and GIFs 

$form->addElement($image); 

$this->view->form = $form; 

if($this->getRequest()->isPost()) 
{ 
    if(!$form->isValid($this->getRequest()->getParams())) 
    { 
     return $this->render('add'); 
    } 

    if(!$form->image->receive()) 
    { 
     $this->view->message = '<div class="popup-warning">Errors Receiving File.</div>'; 
     return $this->render('add'); 
    } 

    if($form->image->isUploaded()) 
    { 
     $values = $form->getValues(); 
     $source = $form->image->getFileName(); 

     //to re-name the image, all you need to do is save it with a new name, instead of the name they uploaded it with. Normally, I use the primary key of the database row where I'm storing the name of the image. For example, if it's an image of Person 1, I call it 1.jpg. The important thing is that you make sure the image name will be unique in whatever directory you save it to. 

     $new_image_name = 'someNameYouInvent'; 

     //save image to database and filesystem here 
     $image_saved = move_uploaded_file($source, '/www/yoursite/images/'.$new_image_name); 
     if($image_saved) 
     { 
      $this->view->image = '<img src="/images/'.$new_image_name.'" />'; 
      $form->reset();//only do this if it saved ok and you want to re-display the fresh empty form 
     } 
    } 
} 
0

Assurez-vous que votre vue affiche également les messages d'erreur générés dans le contrôleur: erreurs de chargement, validation de zone, validation de fichier. Renommer serait votre travail, comme le ferait un autre post-traitement comme par exemple la conversion image-magick.

2

d'abord, jetez un oeil à ce tutoriel Quick Start. Notez comment il a un ErrorController.php qui affichera des messages d'erreur pour vous. Notez également comment l'application.ini a ces lignes pour que PHP émette des messages d'erreur, mais assurez-vous que vous êtes dans l'environnement de "développement" pour les voir (ce qui est défini dans public/.htaccess).

phpSettings.display_startup_errors = 1 
phpSettings.display_errors = 1 

En second lieu, ZF a un filtre de changement de nom pour le téléchargement de fichiers:

$upload_elt = new Zend_Form_Element_File('upload'); 
$upload_elt 
->setRequired(true) 
->setLabel('Select the file to upload:') 
->setDestination($uploadDir) 
->addValidator('Count', false, 1) // ensure only 1 file 
->addValidator('Size', false, 2097152) // limit to 2MB 
->addValidator('Extension', false, 'doc,txt') 
->addValidator('MimeType', false, 
       array('application/msword', 
       'text/plain')) 
->addFilter('Rename', implode('_', 
        array($this->_user_id, 
        $this->_upload_category, 
        date('YmdHis')))) 
->addValidator('NotExists', false, $uploadDir) 
; 

Certaines des choses intéressantes ci-dessus:

  • marquer le téléchargement au besoin (que votre .ini n » t semblent faire)
  • mettre tous les téléchargements dans un répertoire spécial
  • taille de fichier limite un d types MIME acceptables
  • renommage télécharger sur myuser_category_timestamp
  • ne remplace pas un fichier existant (peu probable, compte tenu de notre système d'horodatage, mais assurons-nous de toute façon)

Ainsi, le passe au-dessus de votre forme. Dans le contrôleur/action qui reçoit le téléchargement, vous pouvez le faire:

$original_filename = $form->upload->getFileName(null, false); 
if ($form->upload->receive()) { 
    $model->saveUpload(
    $this->_identity, $form->upload->getFileName(null, false), 
    $original_filename 
); 
} 

Notez la façon dont nous saisissons la original_filename $ (si elle vous en avez besoin) avant de faire recevoir(). Après avoir reçu(), nous faisons getFileName() pour obtenir la chose que le filtre renommer a choisi comme nouveau nom de fichier.

Enfin, dans la méthode model-> saveUpload, vous pouvez stocker n'importe quel contenu dans votre base de données.

0

En suivant la liste de lo_fye j'ai rencontré des problèmes avec les décorateurs personnalisés. Je n'ai pas le décorateur de fichier par défaut défini et obtenu l'exception suivante:

Warning: Exception caught by form: No file decorator found... unable to render file element Stack Trace: 

La réponse à cette question est que l'un de vos decrators doit implémenter l'interface vide Zend_Form_Decorator_Marker_File_Interface

0

parfois aussi il arrive bug quand en utilisant une requête ajax. Essayez-le sans une requête ajax et n'oubliez pas le formulaire en plusieurs parties.