Как лучше всего отменить загрузку файла формы Zend?

Я экспериментирую с загрузкой файлов в 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» вроде работает, но он также выдает предупреждение, и, поскольку я понятия не имею, почему он работает, я с подозрением отношусь к тому, что на самом деле происходит.


person Peter M    schedule 03.03.2010    source источник
comment
Не могли бы вы уточнить, что вы хотите сделать, отменив загрузку?   -  person blockhead    schedule 03.03.2010


Ответы (1)


Попробуйте if ($cancel->isChecked()) вместо if ($cancel == 'Cancel')

ИЗМЕНИТЬ

Вот как работает загрузка файлов. Форма отправляется, и браузер отправляет файл через HTTP на сервер. PHP видит форму с enctype "multipart / form-data" и элемент файла и сохраняет этот файл во временном месте. На этом этапе, если вы вызываете «Receive», он фактически вызывает за кулисами функции PHP, которые перемещают этот файл из его временного местоположения.

После того, как вы нажмете «Отправить», браузер отправит файл, нравится вам это или нет. Вы можете проигнорировать файл, и это похоже на то, что вы пытаетесь сделать. Однако if ($cancel == 'Cancel') не похоже, что он будет работать, потому что значение чувствительно к регистру. Чтобы избежать такого рода ошибок, рекомендуется использовать if ($cancel->isChecked()).

Не могли бы вы уточнить, что именно вы пытаетесь сделать?

person blockhead    schedule 03.03.2010
comment
Именно так я обнаруживаю, что была вызвана отмена, и хотя это, вероятно, то, что мне следует делать, как это прервет загрузку? - person Peter M; 03.03.2010
comment
Я немного расширил свой ответ. - person blockhead; 03.03.2010
comment
После долгих поисков я понимаю, что файл передается независимо от того, что вы делаете. Вы правы, что я пытаюсь игнорировать загруженный файл и отредактировал свой вопрос. Весь вопрос об отмене - это отдельное обсуждение. Во-первых, то, что я делаю, является правильным с учетом регистра, поэтому код следует путями, которые я ожидал. Я немного прочитал об isChecked (), и мне кажется, что мне нужно загрузить форму с опубликованными данными перед ее использованием. Если так, то это меняет только базовую схему моих действий (не особо важно). - person Peter M; 03.03.2010