Я пытаюсь ограничить загрузку определенных типов файлов в Zend Framework 2 (хочу разрешить только файлы .png и .jpg), но у меня возникают некоторые проблемы с этим.
Он загружается, хотя я указываю только два типа MIME в валидаторах. Вот код
$file = new File();
$form->setInputFilter($file->getInputFilter());
$captions = $request->getPost()->toArray();
$get_file = $this->params()->fromFiles('file');$data = array_merge_recursive($this->getRequest()->getPost()->toArray(), $this->getRequest()->getFiles()->toArray());
$form->setData($data);
if ($form->isValid()) {
$size = new Size(array('max' => FileHandler::FILESIZE));
$mime = new MimeType('image/jpg,image/png');
$adapter = (new Http())->setValidators(array($size, $mime), $get_file);
if (!$adapter->isValid()) {
$error_msg = $adapter->getMessages();
$error = array();
foreach ($error_msg as $key => $value) {
$error[] = $value;
}
$form->setMessages(array('file' => $error));
return $this->redirect()->toUrl('/admin/upload-failure');
Как видите, он установлен как валидатор для проверки размера и типа пантомимы.
Есть идеи по этому поводу?
Вы создаете MimeType
валидатор неверен, передав неверный формат опции. Это должен быть массив с ключом mimeType. Проверьте доступные варианты Вот.
Вместо того, чтобы пытаться проверять ваши файлы, используя встроенный экземпляр Http, я рекомендую написать специальный класс InputFilter для этой работы. Zend Framework 2 имеет специальный Zend \ InputFilter \ FileInput что отличается от других, особенно в отношении потока проверки: средства проверки FileInput запускаются перед фильтрами. Он также автоматически вводит и использует Zend \ Validator \ Файл \ Загрузить валидатор, который также проверяет файлы на наличие возможных ошибок во время загрузки.
Вы можете легко использовать все эти встроенные функции, создав MyFileFilter
класс, как показано ниже:
<?php
namespace Application\InputFilter;
use Zend\InputFilter\FileInput;
use Zend\InputFilter\InputFilter;
use Zend\Validator\File\Size;
use Zend\Validator\File\MimeType;
class MyFileFilter extends InputFilter
{
/**
* Constructor
*/
public function __construct($postFile)
{
$size = new Size(['max' => FileHandler::FILESIZE]);
$mime = new MimeType(['mimeType' => 'image/jpg,image/png']);
$input = new FileInput('file');
$input->setValue($postFile);
$input->getValidatorChain()
->attach($size)
->attach($mime);
$this->add($input);
}
}
Итак, в ваших контроллерах или сервисах вы можете сделать это:
$filter = new \Application\InputFilter\MyFileFilter($get_file);
if($filter->isValid()) {
// ...
}
Еще одна хорошая вещь об этом подходе — вы можете повторно использовать MyInputFilter для других требований к загрузке в вашем приложении, просто внеся некоторые незначительные улучшения. (Параметризация типов MIME, значения размера и т. Д.)
Других решений пока нет …