2011-03-08 61 views
5

我使用Zend Form和上傳文件。我需要爲它重命名和用戶addFilter。但是如果我試圖在代碼中獲得文件的擴展名,我會得到一個錯誤:「文件太多,最大'1'但允許'2'。如果我嘗試使用$ _FILES獲得擴展名,它看起來可以解決,但看起來很難看。你能告訴我如何重命名文件保存它的擴展名?Zend_Form_Element_File重命名文件保存擴展名

 $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

你能告訴哪一行代碼拋出了這個錯誤嗎? – emaillenin 2011-03-08 12:17:56

+0

如果我使用這一行,那麼驗證器在我嘗試上載文件時無法驗證。 – Oleg 2011-03-08 16:12:10

+0

我發現類似的問題類似的鏈接http://framework.zend.com/issues/browse/ZF-7851?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory-tabpanel。 – Oleg 2011-03-08 16:36:34

回答

14

我假設你上傳多個文件,如果$形式 - >文件 - >的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; 
} 

還應該工作,即使你不執行多個文件上傳。

+0

我不使用多重上傳,這就是爲什麼我發現奇怪的這個錯誤。 – Oleg 2011-03-08 16:10:16

+0

$ form-> file-> getFileName()只返回一個文件,但是zend表單驗證失敗,錯誤爲:「允許的文件太多,最大值爲'1'但給出'2'」 – Oleg 2011-03-08 16:15:49

+0

它看起來像這個驗證器$元素 - > addValidator('Count',false,1);的形式失敗,但它很奇怪,因爲我沒有得到多個文件。 – Oleg 2011-03-08 16:19:44

1

嘗試使用的東西沿着線:

$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

請原諒,我現在不太明白如何將它與Zend_Form集成。 – Oleg 2011-03-08 16:25:13

2

這是我在控制器代碼,它工作在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.htmlhttp://framework.zend.com/manual/en/zend.filter.input.html

請記住,您不能在裝飾器中爲文件元素使用'viewHelper'。而是使用'文件'。希望這仍然有幫助。

相關問題