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

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

1 Ответ

0 голосов
/ 03 марта 2010

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

EDIT

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

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

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

...