Source of file FileInput.php
Size: 5,138 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/InputFilter/FileInput.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | <?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\InputFilter; use Zend\Validator\File\UploadFile as UploadValidator; /** * FileInput is a special Input type for handling uploaded files. * * It differs from Input in a few ways: * * 1. It expects the raw value to be in the $_FILES array format. * * 2. The validators are run **before** the filters (the opposite behavior of Input). * This is so is_uploaded_file() validation can be run prior to any filters that * may rename/move/modify the file. * * 3. Instead of adding a NotEmpty validator, it will (by default) automatically add * a Zend\Validator\File\Upload validator. */ class FileInput extends Input { /** * @var bool */ protected $isValid = false; /** * @var bool */ protected $autoPrependUploadValidator = true; /** * @param bool $value Enable/Disable automatically prepending an Upload validator * @return FileInput */ public function setAutoPrependUploadValidator($value) { $this->autoPrependUploadValidator = $value; return $this; } /** * @return bool */ public function getAutoPrependUploadValidator() { return $this->autoPrependUploadValidator; } /** * @return mixed */ public function getValue() { $value = $this->value; if ($this->isValid && is_array($value)) { // Run filters ~after~ validation, so that is_uploaded_file() // validation is not affected by filters. $filter = $this->getFilterChain(); if (isset($value['tmp_name'])) { // Single file input $value = $filter->filter($value); } else { // Multi file input (multiple attribute set) $newValue = array(); foreach ($value as $fileData) { if (is_array($fileData) && isset($fileData['tmp_name'])) { $newValue[] = $filter->filter($fileData); } } $value = $newValue; } } return $value; } /** * @param mixed $context Extra "context" to provide the validator * @return bool */ public function isValid($context = null) { $this->injectUploadValidator(); $validator = $this->getValidatorChain(); //$value = $this->getValue(); // Do not run the filters yet for File uploads (see getValue()) $rawValue = $this->getRawValue(); if (!is_array($rawValue)) { // This can happen in an AJAX POST, where the input comes across as a string $rawValue = array( 'tmp_name' => $rawValue, 'name' => $rawValue, 'size' => 0, 'type' => '', 'error' => UPLOAD_ERR_NO_FILE, ); } if (is_array($rawValue) && isset($rawValue['tmp_name'])) { // Single file input $this->isValid = $validator->isValid($rawValue, $context); } elseif (is_array($rawValue) && !empty($rawValue) && isset($rawValue[0]['tmp_name'])) { // Multi file input (multiple attribute set) $this->isValid = true; foreach ($rawValue as $value) { if (!$validator->isValid($value, $context)) { $this->isValid = false; break; // Do not continue processing files if validation fails } } } return $this->isValid; } /** * @return void */ protected function injectUploadValidator() { if (!$this->autoPrependUploadValidator) { return; } $chain = $this->getValidatorChain(); // Check if Upload validator is already first in chain $validators = $chain->getValidators(); if (isset($validators[0]['instance']) && $validators[0]['instance'] instanceof UploadValidator ) { $this->autoPrependUploadValidator = false; return; } $chain->prependByName('fileuploadfile', array(), true); $this->autoPrependUploadValidator = false; } /** * No-op, NotEmpty validator does not apply for FileInputs. * See also: BaseInputFilter::isValid() * * @return void */ protected function injectNotEmptyValidator() { $this->notEmptyValidator = true; } /** * @param InputInterface $input * @return FileInput */ public function merge(InputInterface $input) { parent::merge($input); if ($input instanceof FileInput) { $this->setAutoPrependUploadValidator($input->getAutoPrependUploadValidator()); } return $this; } } |