Я экспериментирую с загрузкой файлов в Zend_Form с использованием Zend_Form_Element_File, выполняя что-то подобное в моей форме, чтобы мой контроллер мог обработать фактическую загрузку (что в моем случае должно в конечном итоге сделать несколько пользовательских имен файлов на летать).
$element = new Zend_Form_Element_File('Upload');
$element->setDestination(UPLOAD_PATH)
->setValueDisabled(true);
$submit = new Zend_Form_Element_Submit('submit');
В действии контроллера у меня есть (очень упрощенный) код, подобный следующему, который хорошо работает:
$form = new MyForm();
$this->view->form = $form;
if ($this->getRequest()->isPost()) {
$formData = $this->getRequest()->getPost();
if ($form->isValid($formData)) {
$form->Upload->receive();
$this->_redirect('/nextAction');
} else {
$form->populate($formData);
}
}
Однако (и вот оно) я хочу сделать так, чтобы кнопка отмены в моей форме обрабатывалась следующим образом:
[Form]
$cancel = new Zend_Form_Element_Submit('cancel');
[Controller]
if ($this->getRequest()->isPost()) {
$formData = $this->getRequest()->getPost();
$cancel = $this->getRequest()->getPost('cancel');
if ($cancel == 'Cancel') {
$this->_redirect('/nextAction');
}
if ($form->isValid($formData)) {
$form->Upload->receive();
$this->_redirect('/nextAction');
} else {
$form->populate($formData);
}
}
Проблема начинается, когда пользователь выбирает файл с помощью «Загрузить», а затем нажимает «Отмена», чтобы выйти из действия. Форма не знает разницы между «Отправить» и «Отмена» и инициирует передачу с конца браузера. На стороне сервера функция receive () не вызывается, и это приводит к зависанию всего процесса.
В этом старом (не Zend) SO-вопросе "Отменить отправку веб-формы с помощью php" предлагаемый ответ - иметь кнопку отмены в отдельной форме. Я не думаю, что это то, что я хочу делать в системе на основе Zend.
В этом старом (Zend) вопросе на форуме "Проблемы загрузки файла элемента Zend Form" предлагаемый ответ для отмены загрузки - сделать что-то вроде этого:
if ($cancel == 'Cancel') {
unlink($form->Upload->getValue());
$this->_redirect('/nextAction');
}
Я пробовал это, и это, кажется, работает, но я не знаю, почему и когда я смотрю за кулисы, я фактически вижу, что это генерирует ошибку вида:
Предупреждение: отсоединить (<filename>
): такого файла или каталога нет в <line in controller code where unlink() call is>
Итак, мой главный вопрос - как лучше всего отменить загрузку файла? (и что делает unlink - даже с ошибкой?)
Редактировать 3/3
Для пояснения, загрузка HTML-форм довольно глупа. Если у вас есть несколько кнопок отправки в форме, содержащей элемент File, то независимо от того, какую кнопку отправки вы используете, файл будет перенесен в каталог временной загрузки на вашем сервере.
Но Zend пытается быть умным, он позволяет вам отложить копирование файла из временного каталога в конечный пункт назначения через "setValueDisabled (true)" в форме и "receive ()" в контроллере.
Однако, если вы инициируете загрузку в форме, но не вызываете "receive () в контроллере, то весь процесс Zend, похоже, блокируется (я получаю браузер, постоянно сообщающий о" загрузке "и больше ничего не делающий).
Я ищу решение на основе Zend (или чистого php) для возврата из загрузки файла на стороне сервера, после файла поступило во временный каталог, но перед вызовом " receive () "требуется.
Кажется, что работает метод «unlink», но он также выдает предупреждение, и, поскольку у меня нет реального представления о том, почему он работает, я подозреваю, что на самом деле происходит.