Zend_Form_Element_File 重命名保存扩展名的文件

5

我使用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;
                }       

你能告诉我哪一行代码抛出了那个错误吗? - Raj
如果我使用这行代码,那么当我尝试上传文件时,验证器将无法通过验证。 - Oleg
我找到了一个类似的链接,里面有相似的问题http://framework.zend.com/issues/browse/ZF-7851?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory-tabpanel。 - Oleg
3个回答

14

我假设如果$form->file->getFileName()返回的值大于1,你会上传多个文件。在这种情况下,你可以应用Rename过滤器并按以下方式接收单个文件:

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

即使您不执行多个文件上传,它也应该能够正常工作。


我不使用多个上传,所以我觉得这个错误很奇怪。 - Oleg
$form->file->getFileName() 只返回一个文件,但 Zend 表单验证失败,并显示错误:“文件太多,最多允许 '1' 个,但却有 '2' 个”。 - Oleg
看起来这个表单的验证器 $element->addValidator('Count', false, 1); 失败了,但很奇怪,因为我没有收到多个文件。 - Oleg
非常感谢。看起来这段代码运行正常。我觉得很奇怪我的代码不起作用,我认为Zend_Form应该允许不直接使用Zend_File_Transfer_Adapter_Http。 - Oleg

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('back'和'front')和提交按钮('upload')。
我希望这能给你一个使用重命名过滤器并仍然使用$form->isValid()的想法。不要混淆http://framework.zend.com/manual/en/zend.file.transfer.filters.htmlhttp://framework.zend.com/manual/en/zend.filter.input.html 同时请记住,您不能在文件元素的装饰器中使用“viewHelper”。而是使用“File”。希望这仍然有帮助。

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();

抱歉,我现在不太明白如何将其与Zend_Form集成。 - Oleg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接