2010-03-03 4 views
0

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

+0

Можете ли вы уточнить, что вы хотите сделать, «отменив» загрузку? – blockhead

ответ

0

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

EDIT

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

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

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

+0

Именно так я обнаружил, что был вызван «Отмена», и хотя это, вероятно, то, что я должен делать, как это прекратит загрузку? –

+0

Я немного расширил свой ответ. – blockhead

+0

После того, как я много думал, я понимаю, что файл передается независимо от того, что вы делаете. Вы правы, что я пытаюсь игнорировать загруженный файл и отредактировал мой вопрос. Весь вопрос «отменить» - это еще одно обсуждение. Прежде всего, чувствительность к регистру того, что я делаю, верна, поэтому код следует за путями, которые я ожидал от этого. Я читал немного о isChecked(), и мое чувство кишки состоит в том, что мне нужно загрузить форму с опубликованными данными до ее использования. Если это так, это меняет только основной макет моих действий (а не biggie). –