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