Zend_Form_Element_File для переименования расширения файла сохранения

Я использую Zend Form и загружаю файл. Мне нужно переименовать и добавить пользователя addFilter для этого. Но если я пытаюсь получить расширение файла, как в коде, я получаю сообщение об ошибке «Слишком много файлов, разрешено максимум 1, но дано 2». Если я попытаюсь получить расширение с помощью $ _FILES, похоже, что это может сработать, но это покажется некрасивым. Подскажите, пожалуйста, как переименовать файл, сохранив его расширение?

        $form = new Form_ImportSubscribers();               
        if ($this->getRequest()->isPost()) {
            $formData = $this->getRequest()->getPost();
            if ($form->isValid($formData)) {
                //it looks like it works but it's ugly solution
//              $extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); 
                //causes an error "Too much files, maximum '1' are allowed but '2' are given"           
                $extension = pathinfo($form->file->getFileName(), PATHINFO_EXTENSION);              
                $form->file->addFilter('Rename', $accountId . '_' . time() .  '.' . $extension);

                if (!$form->file->receive()) {
                    $this->view->form = $form;
                    $this->view->listName = $list->list_name;                                   
                    return;
                }       

person Oleg    schedule 08.03.2011    source источник
comment
вы можете сказать, в какой строке кода возникла эта ошибка?   -  person Lenin Raj Rajasekaran    schedule 08.03.2011
comment
Если я использую эту строку, то валидатор не проверяет, когда я пытаюсь загрузить файл.   -  person Oleg    schedule 08.03.2011
comment
Я нашел похожую ссылку с аналогичными проблемами framework.zend.com/issues/browse/.   -  person Oleg    schedule 08.03.2011


Ответы (3)


Я предполагаю, что вы загружаете несколько файлов, если $ form-> file-> getFileName () возвращает более одного значения. В этом случае вы можете применить фильтр «Переименовать» и получить отдельные файлы следующим образом:

/*@var $adapter Zend_File_Transfer_Adapter_Http */
$adapter =  $form->file->getTransferAdapter();
$receivingOK = true; 
foreach ($adapter->getFileInfo() as $file => $info) {                                     
    $extension = pathinfo($info['name'], PATHINFO_EXTENSION); 
    $adapter->addFilter('Rename', $accountId . '_' . time() .  '.' . $extension, $file);
    if (!$adapter->receive($file)) {
         $receivingOK = false;
    }
}

if (!$receivingOK) {
    $this->view->form = $form;
    $this->view->listName = $list->list_name;                                   
    return;
} 

Он также должен работать, даже если вы не выполняете загрузку нескольких файлов.

person Marcin    schedule 08.03.2011
comment
Я не использую многократные закачки, поэтому считаю эту ошибку странной. - person Oleg; 08.03.2011
comment
$ form- ›file-› getFileName () возвращает только один файл, но проверка формы zend завершается неудачно с ошибкой: слишком много файлов, допускается максимум «1», но дано «2» - person Oleg; 08.03.2011
comment
Похоже, этот валидатор $ element- ›addValidator ('Count', false, 1); формы не удается, но это странно, потому что я не получаю несколько файлов. - person Oleg; 08.03.2011
comment
Большое тебе спасибо. Похоже, этот код работает. Мне кажется странным, что мой код не работает, я думаю, что Zend_Form должен позволять не использовать Zend_File_Transfer_Adapter_Http напрямую. - person Oleg; 10.03.2011

Это мой код в контроллере, он работает в Zend 1.11:

$uploadForm = new Application_Form_DeckblattUpload();
$front = $uploadForm->getElement('front');
/* @var $front Zend_Form_Element_File */
$tfa = $front->getTransferAdapter();
/* @var $tfa Zend_File_Transfer_Adapter_Abstract */
$tfa->addFilter('Rename', array(
    'target' => APPLICATION_PATH .'/public/dir/somepath.jpg',
    'overwrite' => true));

$back = $uploadForm->getElement('back');
/* @var $front Zend_Form_Element_File */
$tfa = $back->getTransferAdapter();
/* @var $tfa Zend_File_Transfer_Adapter_Abstract */
$tfa->addFilter('Rename', array(
    'target' => APPLICATION_PATH . '/public/someOtherDir/somepath.jpg',
     'overwrite' => true));

if ($this->getRequest()->upload) {
    if ($uploadForm->isValid($this->getRequest()->getParams())) {
        $uploadForm->getValues(); //<- this does the uploading
        //Success-Message
    }
    else {
        //Failure-Message
    }
}
$this->view->uploadForm = $uploadForm;

Форма содержит всего 2 файла Zend_Form_Elements_Files («задний» и «передний») и кнопку отправки («загрузить»).

Надеюсь, это дает вам представление о том, как использовать фильтр переименования и по-прежнему использовать $ form-> isValid (). Не путайте http://framework.zend.com/manual/en/zend.file.transfer.filters.html и http://framework.zend.com/manual/en/zend.filter.input.html

Также имейте в виду, что вы не можете использовать viewHelper в декораторах для файловых элементов. Вместо этого используйте «Файл». Надеюсь, это все еще помогает.

person ACNB    schedule 30.09.2011

Попробуйте использовать что-нибудь вроде:

$upload = new Zend_File_Transfer();
// use setDestination, addValidator etc
$files = $upload->getFileInfo();
foreach ($files as $file => $info) {
    $file = '/path/to/file/name.ext';
    $upload->addFilter('Rename', $file);
    //Do rest of code
}
$upload->receive();
person Ashley    schedule 08.03.2011
comment
Простите, я сейчас не совсем понимаю, как его интегрировать с Zend_Form. - person Oleg; 08.03.2011