Posted on Leave a comment

File Uploads using Zend_Form

Zend Framework Logo

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.