Jan 18

There are several ways of renaming files if you don’t want to use Zend_Form_Element component. However, the following is a ZF technique.Suppose you have a very basic form with a single file element:
Form.php

class My_Form extends Zend_Form
{
    public function init()
    {
                $element = new Zend_Form_Element_File('imagefile');
		$element->setLabel('Upload an image:');
		$element->setDestination($uploaddir); /* file directory */
		$element->addValidator('Count', false, 1);
		$element->addValidator('Size', false, 202400);
		$element->setRequired(false);
		$element->addValidator('IsImage', false, 'jpeg,jpg,png,gif');
		$this->addElement($element, 'imagefile');
     }
}

What you need to do is to override the isValid( .. ) method of your Form Object:

Form.php

public function isValid($data) {
 
		$oldname = pathinfo($this->imagefile->getFileName());
		$newname = $this->getUniqueCode(10) . '.' . $oldname['extension'];
		$this->imagefile->addFilter('Rename',$newname);
		return parent::isValid($data);		
 
}

If you don’t want to loose your other validators , don’t forget to call the parent isValid() method . As you can see, I used PHP’s pathinfo() method to parse the file path. (There should be another one in ZF ). I renamed it with a string of 10 random characters, and kept the extension as it was. Below is the method that you can use for the random file name :

function getUniqueCode($length = "") {	
		$code = md5(uniqid(rand(), true));
		if ($length != "") 
                       return substr($code, 0, $length);
		else 
                       return $code;
}

Finally, in your controller, you basically check if the form is valid,

MyFormController.php

 $request	=	$this->getRequest();
$form		=	new My_Form();
 
if ($request->isPost()) {
 
	if ($form->isValid($request->getPost())) {
 
		$formData = $form->getValues();
 
			try {
				 $form->imagefile->receive();
			} catch (Exception $e) {
				throw new Zend_Exception ('There is a problem with the file upload');
 
 
			}
	}	
}

I hope it helps.

Tagged with:
preload preload preload