Я экспериментирую с загрузкой файлов в 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 Проблемы с загрузкой файла элемента формы " предлагаемый ответ для отмены загрузки - сделать что-то вроде этого:
if ($cancel == 'Cancel') {
unlink($form->Upload->getValue());
$this->_redirect('/nextAction');
}
Я пробовал это, и, похоже, это сработало, но я не знаю, почему и когда я смотрю за шторы, я действительно вижу, что это генерирует ошибку формы:
Предупреждение: unlink (
<filename>
): нет такого файла или каталога в<line in controller code where unlink() call is>
Итак, мой большой вопрос: как лучше всего отказаться от загрузки файла? (а что делает отключение - даже с ошибкой?)
Изменить 3/3
Чтобы уточнить, загрузка HTML-форм довольно тупая. Если у вас есть несколько кнопок отправки в форме, которая имеет элемент File, то независимо от того, какую кнопку отправки вы, кажется, используете, файл будет передан в каталог временной загрузки на вашем сервере.
Но Zend пытается быть умным, он позволяет отложить копирование файла из временного каталога в конечный пункт назначения с помощью «setValueDisabled (true)» в форме и «receive ()» в контроллере.
Однако, если вы инициируете загрузку в форме, но не вызываете "receive ()" в контроллере, то кажется, что весь процесс Zend зависает (я получаю, что браузер постоянно объявляет "загрузка" и больше ничего не делает).
Я ищу решение на основе Zend (или чистого php), чтобы отказаться от загрузки файла на стороне сервера, после того, как файл прибыл во временный каталог, но до вызова "получить ( )" требуется.
Метод «unlink» вроде работает, но он также выдает предупреждение, и, поскольку я понятия не имею, почему он работает, я с подозрением отношусь к тому, что на самом деле происходит.