2009-12-08 26 views
12

Quiero subir una imagen con Zend Framework versión 1.9.6. La carga en sí funciona bien, pero también quiero un par de cosas más ... y estoy completamente atascado.Zend Framework: carga de imágenes

  • Los mensajes de error para no cargar una imagen no se mostrarán.
  • Si un usuario no ingresa todos los campos requeridos pero ha subido una imagen, entonces quiero mostrar la imagen cargada en mi formulario. Ya sea como una imagen o como un enlace a la imagen. Solo alguna forma de retroalimentación para el usuario.
  • Quiero usar Zend_ Validate_ File_ IsImage. Pero parece que no hace nada.
  • Y por último; ¿hay alguna funcionalidad de cambio de nombre automático?

Todas las ideas y sugerencias son bienvenidas. He estado luchando durante dos días.

fragmentos de código Éstos se simplifican:

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; 
    } 
} 
?> 

Mi punto de vista simplemente el eco de la variable 'forma'.

Respuesta

19

En primer lugar, poner esto en el inicio de la secuencia de comandos:

error_reporting (E_ALL); // esto debería mostrar todos los errores de PHP

Creo que los mensajes de error no se encuentran en la forma, ya que re- llene el formulario antes de mostrarlo. Creo que borra cualquier mensaje de error. Para corregir esto, quite esta parte:

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

Para mostrar la imagen cargada en forma, sólo tiene que añadir un div a su plantilla de vista, así:

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

Si la imagen subido bien, a continuación, poblar $ view-> image con una etiqueta img.

En cuanto al cambio de nombre automático, no, no está incorporado, pero es muy fácil. Te mostraré cómo a continuación. He aquí cómo manejar mis subida de imágenes:

$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

Asegúrese de que su vista también muestra los mensajes de error que genera en el controlador: errores de carga, validación de campo, validación de archivos. El cambio de nombre sería su trabajo, al igual que otros procesos posteriores, como el de conversión de imágenes mágicas.

2

En primer lugar, echar un vistazo a la Quick Start tutorial. Tenga en cuenta que tiene un ErrorController.php que mostrará los mensajes de error por usted. También tenga en cuenta cómo la aplicación.ini tiene estas líneas para hacer que PHP emita mensajes de error, pero asegúrese de estar en el entorno de "desarrollo" para verlas (que está configurado en público/.htaccess).

phpSettings.display_startup_errors = 1 
phpSettings.display_errors = 1 

En segundo lugar, ZF tiene un filtro de cambio de nombre para la carga de archivos:

$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) 
; 

Algunas de las cosas interesantes anteriores:

  • marcan la carga según sea necesario (que a su ini doesn' t parece hacer)
  • poner todas las cargas en un directorio especial
  • límite de tamaño de archivo una d tipos MIME aceptables
  • de cambio de nombre de subida a myuser_category_timestamp
  • no sobrescribir un archivo existente (poco probable, dado nuestro esquema de marca de tiempo, pero vamos a asegurarnos de todos modos)

Por lo tanto, lo anterior va en su formulario. En el controlador/acción que recibe la carga, usted puede hacer esto:

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

Nota cómo capturar los $ original_filename (si lo necesita) antes de hacer recibir(). Después de recibir(), obtenemos FileName() para obtener lo que el filtro de cambio de nombre eligió como el nuevo nombre de archivo.

Finalmente, en el método model-> saveUpload puede almacenar cualquier cosa en su base de datos.

0

Al seguir la lista de lo_fye tuve problemas con los decoradores personalizados. no me he puesto el decorador por defecto de archivos y tiene la siguiente excepción:

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

La respuesta a esto es que uno de sus decrators debe implementar la Zend_Form_Decorator_Marker_File_Interface interfaz de vacío

0

También a veces se pasa a error al usando una solicitud de Ajax Pruébalo sin una solicitud ajax y no olvides el formulario multiparte.