Первый мой код:
class ProfileController extends Zend_Controller_Action {
private function getUploadAvatarForm()
{
$form = new Zend_Form;
$form->setAttrib('enctype', 'multipart/form-data');
$form->setAction($this->view->baseUrl('/profile/upload-avatar'))
->setName('uploadAvatarForm')
->setMethod('POST');
$element = new Zend_Form_Element_File('avatar');
$element->setLabel('Upload an image:')
->addFilter('Rename',
array('target' => '/path/toimages/directory/' . $this->userId . '.png',
'overwrite' => true)
);
$element->addValidator('Count', false, 1);
$element->addValidator('Size', false, 102400);
$element->addValidator('Extension', false, 'png');
$form->addElement($element, 'avatar')
->addElement('submit', 'submit_upload', array('label' => 'upload'));
return $form;
}
public function uploadAvatarAction()
{
$form = $this->getUploadAvatarForm();
$this->view->form = $form;
if (!$this->getRequest()->isPost() || !$form->isValid($_POST)) {
return;
}
if (!$form->avatar->receive()) {
... error...
}
... ok ...
}
}
Вопрос в том, что часть бизнес-логики помещается в фильтр переименования. На мой взгляд, оно того стоит, но, может быть, я ошибаюсь.
Я пытаюсь проверить это:
public function testUploadFile()
{
$this->_doLogin('user', 'password');
$this->getRequest()
->setMethod('POST'));
$this->mockFileUpload();
$this->dispatch('profile/upload-avatar');
var_dump($this->getResponse()->getBody());
}
private function mockFileUpload()
{
$_FILES = array(
'avatar' => array(
'name' => 'test.png',
'type' => 'image/png',
'tmp_name' => '/tmp/test.png',
'error' => 0,
'size' => 10127));
}
но получил:
Файл "Аватар" загружен незаконно, возможна атака
Не могли бы вы предложить мне, как проверить эту ситуацию?
(С файловой системой все будет хорошо - я собираюсь использовать для этого vfsStream, поэтому проблема заключается только в эмуляции загрузки после)