2011-03-08 5 views
5

젠드 폼을 사용하고 파일을 업로드합니다. 이름을 바꾸고 사용자 addFilter를 사용해야합니다. 하지만 코드에서 파일의 확장자를 얻으려고하면 "너무 많은 파일이 있지만 최대 '1'이 허용되지만 '2'가 주어집니다. 내가 $ _FILES를 사용하여 확장 기능을 얻으려고한다면, 문제가 생길 수 있지만 보이지는 않습니다. 확장자를 저장하는 파일의 이름을 바꾸는 방법을 알려주시겠습니까?Zend_Form_Element_ 파일 저장 확장자의 이름을 바꿀 파일

 $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

+0

이 줄을 사용하면 파일을 업로드하려고 할 때 유효성 검사기가 유효성을 검사하지 못합니다. – Oleg

+0

비슷한 문제가있는 유사한 링크가 http://framework.zend.com/issues/browse/ZF-7851?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory- 탭 패널에서 발견되었습니다. – Oleg

답변

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

+0

$ form-> file-> getFileName()은 하나의 파일 만 반환하지만 "너무 많은 파일, 최대 '1'이 허용되지만 '2'가 주어집니다." – Oleg

+0

이 유효성 검사기 $ 요소처럼 보입니다 -> addValidator ('Count', false, 1); 양식의 실패하지만, 여러 파일을 얻을 수 없기 때문에 그것은 이상합니다. – Oleg

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

2

이 그것은 젠드 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'를 사용할 수 없습니다. 대신 '파일'을 사용하십시오. 희망이 여전히 도움이됩니다.

관련 문제