【问题标题】:Zend-Image Uploading at Wrong DestinationZend-Image 在错误的目的地上传
【发布时间】:2012-03-19 16:21:50
【问题描述】:

请帮助..我是新手并尝试学习 Zend Framework,但在上传图像时遇到问题。 Application.ini 文件中的脚本

uploads.uploadPath = APPLICATION_PATH "/../public/uploads"

上传图片的表格:

$this->setAction('/data/personil/create')
        ->setMethod('post');

    //Item input untuk gambar
    $images = new Zend_Form_Element_File('images');
    $images->setMultiFile(3)
    ->addValidator('IsImage')
    ->addValidator('Size', false, '204800')
    ->addValidator('Extension', false, 'jpg,png,gif')
    ->addValidator('ImageSize', false, array(
            'minwidth'  => 150,
            'minheight' => 150,
            'maxwidth'  => 700,
            'maxheight' => 700
    ))
    ->setValueDisabled(true);           
    // attach element to form
    $this->addElement($images); 

    // create display group for file elements
    $this->addDisplayGroup(array('images'), 'files');
    $this->getDisplayGroup('files')
    ->setOrder(40)
    ->setLegend('Images');

控制器动作创建:

public function createAction()
{
    $form = new Pengadilan_Form_PersonilCreate();
    $this->view->form = $form;
    $flashMessenger = $this->_helper->FlashMessenger;

    //SImpan kedatabase
    if($this->getRequest()->isPost()){
        if($form->isValid($this->getRequest()->getPost())){
            $personil = new Pengadilan_Model_Personil();
            $personil->fromArray($form->getValues());
            $personil->RecordDate = date('Y-m-d', mktime());
            $personil->DisplayStatus = 0;
            $personil->DisplayUntil = null;
            $personil->save();
            $id = $personil->RecordId;

            $config = $this->getInvokeArg('bootstrap')->getOption('uploads');
            $form->images->setDestination($config['uploadPath']);
            $adapter = $form->images->getTransferAdapter();
            for($x=0; $x<$form->images->getMultiFile(); $x++) {
                $xt = @pathinfo($adapter->getFileName('images_'.$x.'_'), PATHINFO_EXTENSION);
                $adapter->clearFilters();
                $adapter->addFilter('Rename', array(
                        'target' => sprintf('%d_%d.%s', $id, ($x+1), $xt),
                        'overwrite' => true
                ));
                $adapter->receive('images_'.$x.'_');

            }


             $this->_helper->getHelper('FlashMessenger')->addMessage('Data sekses diinput ke database #' . $id . '. Admin akan segera merivew, jika diterima, akan ditampilkan dalam waktu 48 jam, Terima kasih.');
    $this->_redirect('/data/personil/sukses');
        }
    }

}

控制器动作展示:

public function displayAction()
{
    //Pertama setting filters
    $filters  = array(
            'id' => array('HtmlEntities', 'StripTags', 'StringTrim')
            );
    $validators = array(
            'id' => array('NotEmpty', 'Int')
            );
    $input = new Zend_Filter_Input($filters, $validators);
    $input->setData($this->getRequest()->getParams());      
    if($input->isValid()){
        $q = Doctrine_Query::create()
            ->from('Pengadilan_Model_Personil p')
            ->leftJoin('p.Pengadilan_Model_Jabatan j')
            ->leftJoin('p.Pengadilan_Model_Tupoksi t')
            ->leftJoin('p.Pengadilan_Model_Golongan g')             
            ->leftJoin('p.Pengadilan_Model_Agama a')
            ->leftJoin('p.Pengadilan_Model_Kelamin k')
            ->where('p.RecordId = ?', $input->id)
            ->addWhere('p.DisplayStatus = 1')
            ->addWhere('p.DisplayUntil >= CURDATE()');


        $result = $q->fetchArray();
        if(count($result) == 1){
            $this->view->personil = $result[0];
            $this->view->images = array();
            $config = $this->getInvokeArg('bootstrap')->getOption('uploads');
            foreach (glob("{$config['uploadPath']}/{$this->view->item['RecordID']}_*") as $file) {
                $this->view->images[] = basename($file);

    }
        }else{
            throw new Zend_Exception('Maaf, halaman tidak ditemukan, 404');
        }
    }else{
        throw new Zend_Exception('Kesalahan Input');
    }

}

视图中的最后一个脚本:display.phtml

  <div id="images">
<?php foreach ($this->images as $image): ?>
<img src="/uploads/<?php echo $this->escape($image); ?>" width="150" height="150" />    
<?php endforeach; ?>

配置中的图片上传目的地是 /public/uploads 以我为例,图片位于 /public

图片成功上传并重命名,但在目录之外 图像不会显示在 display.phtml

非常感谢您的帮助..

【问题讨论】:

    标签: zend-framework


    【解决方案1】:

    首先你需要设置你的表单编码File element link
    $form-&gt;setAttrib('enctype', 'multipart/form-data');

    此外,您可能应该在发布表单之前完成image 元素的设置,而不是之后。所以将setDestination 的东西移到你初始化表单的地方,你可能有更好的机会让它工作。

    public function createAction()
    {
        $form = new Pengadilan_Form_PersonilCreate();
    
        //set form encoding
        $form->setAttrib('enctype', 'multipart/form-data');
    
        //get path and set destination for image element
        $config = $this->getInvokeArg('bootstrap')->getOption('uploads');
        $form->images->setDestination($config['uploadPath']);
    
        $this->view->form = $form;
        //consider intializing flash messenger in the init() method
        $flashMessenger = $this->_helper->FlashMessenger;
    
        //SImpan kedatabase
        if($this->getRequest()->isPost()){
            if($form->isValid($this->getRequest()->getPost())){
                //more code...
    
                $adapter = $form->images->getTransferAdapter();
                for($x=0; $x<$form->images->getMultiFile(); $x++) {
                    $xt = @pathinfo($adapter->getFileName('images_'.$x.'_'), PATHINFO_EXTENSION);
                    $adapter->clearFilters();
                    $adapter->addFilter('Rename', array(
                            'target' => sprintf('%d_%d.%s', $id, ($x+1), $xt),
                            'overwrite' => true
                    ));
                    $adapter->receive('images_'.$x.'_');
    
                }
    
                 $this->_helper->getHelper('FlashMessenger')->addMessage('Data sekses diinput ke database #' . $id . '. Admin akan segera merivew, jika diterima, akan ditampilkan dalam waktu 48 jam, Terima kasih.');
                 $this->_redirect('/data/personil/sukses');
            }
        }
    
    }
    

    不确定这是否能解决所有问题,但它应该是一个开始......

    【讨论】:

    • 谢谢 RockyFord 先生,我已经按照您在 PersonilCreate 的建议更改了我的脚本,但不幸的是没有任何改变..
    • 我想在 $config['uploadPath'] 上做一个 var_dump 以确保它是正确的。尝试使用字符串输入路径。清除所有验证器和过滤器,确保它正常工作,然后添加回来,直到它失败。确保您在目标文件夹中具有写入权限。我希望有些东西能奏效,因为代码看起来基本正确。
    • 这里执行 var_dump 时得到的结果:0.4252.9255.4257.92510.42512.9250.4252.9255.4257.92510.42512.92515.42517.92520.42522.925 数组 'uploadPath' =>docs'uploadPath' => \pengadilan\application/../public/uploads' (长度=59)
    • 你到底做了什么 var_dump?如果这是var_dump($config['uploadPath']; 的结果,它将不起作用,因为您将数组而不是字符串传递给setDestination()
    • 升级到ZF 1.9.1后问题解决了,感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2011-06-03
    相关资源
    最近更新 更多