2011-03-08 22 views
5

Utilizo Zend Form y cargo el archivo. Necesito cambiar el nombre y el usuario addFilter para ello. Pero si trato de obtener la extensión del archivo como en el código me sale un error "Demasiados archivos, máximo '1' están permitidos pero '2' son dados". Si intento obtener una extensión usando $ _FILES, parece que puede funcionar pero parece feo. ¿Podría decirme cómo cambiar el nombre del archivo guardando su extensión?Zend_Form_Element_File para cambiar el nombre del archivo que guarda la extensión

 $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; 
       }  
+0

¿Puedes decir qué línea de código arrojó ese error? – emaillenin

+0

Si utilizo esta línea, el validador no puede validarse cuando intento subir un archivo. – Oleg

+0

Encontré un enlace similar con problemas similares http://framework.zend.com/issues/browse/ZF-7851?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory-tabpanel. – Oleg

Respuesta

14

Asumo que cargar varios archivos si $ form-> Archivo-> getFileName() devuelve más de un valor. En este caso se podría aplicar el filtro Cambiar nombre y recibir archivos individuales de la siguiente manera:

/*@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; 
} 

también debería funcionar incluso si no se realiza ninguna cargar varios archivos.

+0

No uso cargas múltiples, es por eso que me parece extraño este error. – Oleg

+0

$ form-> file-> getFileName() devuelve solo un archivo, pero la validación del formulario zend falla con el error: "Demasiados archivos, máximo '1' están permitidos pero '2' son dados" – Oleg

+0

Parece que este validador $ elemento -> addValidator ('Count', falso, 1); de la forma falla, pero es extraño porque no obtengo archivos múltiples. – Oleg

1

Trate de usar algo en la línea de:

$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(); 
+0

Perdón, todavía no entiendo muy bien cómo integrarlo con Zend_Form. – Oleg

2

Este es mi código en un controlador, funciona en 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; 

el formulario contiene sólo 2 Zend_Form_Elements_Files (atrás 'y 'delantero y el botón de envío) (' subir').

Espero que esto le dé una idea de cómo usar el filtro de cambio de nombre y aún use $ form-> isValid(). No confunda http://framework.zend.com/manual/en/zend.file.transfer.filters.html y http://framework.zend.com/manual/en/zend.filter.input.html

También tenga en cuenta que no puede usar el 'viewHelper' en decoradores para los elementos del archivo. En su lugar, use 'Archivo'. Espero que esto todavía ayude

Cuestiones relacionadas