The Zend\FileInput
class is a special Input
type for uploaded files found in the $_FILES
array.
While FileInput
uses the same interface as Input
, it differs in a few ways:
- It expects the raw value to be in the
$_FILES
array format. - The validators are run before the filters (which is the opposite behavior of
Input
). This is so that anyis_uploaded_file()
validation can be run prior to any filters that may rename/move/modify the file. - Instead of adding a
NotEmpty
validator, it will (by default) automatically add aZend\Validator\File\UploadFile
validator.
The biggest thing to be concerned about is that if you are using a <input type="file">
element in your form,
you will need to use the FileInput
instead of Input
or else you will encounter issues.
Usage of FileInput
is essentially the same as Input
:
use Zend\Http\PhpEnvironment\Request;
use Zend\Filter;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Input;
use Zend\InputFilter\FileInput;
use Zend\Validator;
// Description text input
$description = new Input('description'); // Standard Input type
$description->getFilterChain() // Filters are run first w/ Input
->attach(new Filter\StringTrim());
$description->getValidatorChain() // Validators are run second w/ Input
->attach(new Validator\StringLength(array('max' => 140)));
// File upload input
$file = new FileInput('file'); // Special File Input type
$file->getValidatorChain() // Validators are run first w/ FileInput
->attach(new Validator\File\UploadFile());
$file->getFilterChain() // Filters are run second w/ FileInput
->attach(new Filter\File\RenameUpload(array(
'target' => './data/tmpuploads/file',
'randomize' => true,
)));
// Merge $_POST and $_FILES data together
$request = new Request();
$postData = array_merge_recursive($request->getPost()->toArray(), $request->getFiles()->toArray());
$inputFilter = new InputFilter();
$inputFilter->add($description)
->add($file)
->setData($postData);
if ($inputFilter->isValid()) { // FileInput validators are run, but not the filters...
echo "The form is valid\n";
$data = $inputFilter->getValues(); // This is when the FileInput filters are run.
} else {
echo "The form is not valid\n";
foreach ($inputFilter->getInvalidInput() as $error) {
print_r ($error->getMessages());
}
}
Also see