
File uploads can be managed quite easily using Zend_Form. First off, create a Zend_Form instance and add a Zend_Form_Element_File element, representing the file-input element. Make sure to set the encoding type to multipart/form-data:
class Form_FileUpload extends Zend_Form { public function init() { $this->setAttrib('enctype', 'multipart/form-data'); $element = new Zend_Form_Element_File('image'); $element->setLabel('Some picture'); $element->addValidator('Count', false, 1); $element->addValidator('Size', false, 204800); $element->addValidator('Extension', false, 'jpg,png,gif'); $element->setRequired(true); $this->addElement($element); $this->addElement('text', 'someText', array( 'filters' => array('StringTrim'), 'label' => _('Some Text'), 'decorators' => array( 'viewHelper', array( 'Label', array('class' => 'label') ), 'Errors' ), 'validators' => array( array('StringLength', true, array(5, 255))), 'id' => 'SomeText' )); }
Now that we have a form let’s add the logic in the corresponding controller. We only need one action (imageAction) to process POST requests and GET requests:
public function imageAction() { $form = new Form_FileUpload(); if ($this->getRequest()->isPost()) { $post = $this->getRequest()->getPost(); if ($form->isValid($post)) { $upload = new Zend_File_Transfer_Adapter_Http(); $upload->setDestination(realpath(APPLICATION_PATH . '\..\data\upload')); try { //be sure to call receive() before getValues() $upload->receive(); } catch (Zend_File_Transfer_Exception $e) { $e->getMessage(); } $formData = $form->getValues(); //be sure to call this after receive() $filename = $upload->getFileName('image'); //optional info about uploaded file $filesize = $upload->getFileSize('image'); $filemimeType = $upload->getMimeType('image'); $dstFilePath = '/images/'.$filename; $filterFileRename = new Zend_Filter_File_Rename(array('target' => $dstFilePath, 'overwrite' => true)); $filterFileRename->filter($filename); //move uploade file to destination } } $this->view->form = $form; }
That’s all there is to it. receive() processes the uploaded file, i.e. checks if everything went well. In order to move uploaded files to certain destination folders you can use Zend_Filter_File_Rename. Unlike the name suggests it does not only rename files but also is capable of moving files.
Make sure to call receive() before getValues() as Zend_Form otherwise messes up the file upload.