【问题标题】:zend framework form upload edit problemzend框架表单上传编辑问题
【发布时间】:2011-05-12 12:20:39
【问题描述】:

我正在使用zend表单上传图片。

我的问题是在表单中编辑信息时,表单附带了所有信息,但 file_path 为空,因此当您单击提交发生的更新时,将 file_path 设置为 null。

我只想在加载时查看可编辑项目的路径,所以当您点击提交时,旧路径就会出现。

public function EditaddAction() {

    $session = new Zend_Session_Namespace('user');
    $userid = $session->id;
    // in case the request was an edit request
    $id = (int) $this->_request->getParam('id');
    //The incoming request
    $request = $this->getRequest();
    //initialize form
    $form = new Admin_Form_Banner();
    //uploaded file settings
    $file = $form->file_path;
    $file->setDestination(ZendX_Image::getFullUploadPath() . '/files/get/original/');
    //instance of db
    $db = Zend_Db_Table::getDefaultAdapter();

    if ($this->getRequest()->isPost()) {
        if ($form->isValid($request->getPost())) {

            $dbFilePath = "/files/get/original/" . $file->getFileName(null, false);


            //code to get the duration of the video
            $sourceVideo = PUBLIC_PATH . $form->getValue('file_path');
            ob_start();
            passthru("ffmpeg -i \"" . $sourceVideo . "\" 2>&1");
            $duration = ob_get_contents();
            ob_end_clean();
            preg_match('/Duration: (.*?),/', $duration, $matches);
            $duration = $matches[1];
            $duration_array = preg_split('[:]', $duration);
            $duration = $duration_array[0] * 3600 + $duration_array[1] * 60 + $duration_array[2];

            die($time);
            end of code to get the duration of the video
            if (isset($id) && $id != "" && $file->receive()) {
                try {
                    $db->update('banner', array('banner_title' => $form->getValue('banner_title'),
                        'banner_type' => $form->getValue('banner_type'),
                        'banner_position' => $form->getValue('banner_position'),
                        'banner_link' => $form->getValue('banner_link'),
                        'link_open' => $form->getValue('link_open'),
                        'file_path' => $dbFilePath,
                        'is_active' => $form->getValue('is_active')
                            ), array('id =?' => $id));
                    $this->flash('Banner Updated', 'admin/banner');
                } catch (Exception $e) {
                    $this->flash($e->getMessage(), 'admin/banner');
                }
            } else {
                try {

                    $db->insert('banner', array('banner_title' => $form->getValue('banner_title'),
                        'banner_type' => $form->getValue('banner_type'),
                        'banner_position' => $form->getValue('banner_position'),
                        'banner_link' => $form->getValue('banner_link'),
                        'link_open' => $form->getValue('link_open'),
                        'file_path' => $dbFilePath,
                        'is_active' => $form->getValue('is_active'),
                        'created_by' => $userid,
                        'date_ceated' => date('Y/m/d H:i:s'),
                        'is_deleted' => 0,
                    ));
                    $this->flash('Banner Added', 'admin/banner');
                } catch (Exception $e) {
                    $this->flash($e->getMessage(), 'admin/banner');
                }
            }
        }
    }

    if (isset($id) && $id != "") {
        $checkvalues = $db->fetchCol($db->select()->from(array('banner'),array('file_path')));
        $values = $db->fetchRow("SELECT * FROM banner WHERE id = ?", $id);
        $values['file_path'] = $checkvalues;
        $form->populate($values);
    }

    $this->view->form = $form;

【问题讨论】:

  • 我会将该描述编辑为多个句子和段落,以便人们有机会阅读它!
  • 更新时不要覆盖数据库中的值,除非它已经提供?
  • 我还是遇到了同样的问题
  • 如果这是您所追求的,您将无法获取用户的本地文件路径。
  • 现在我不想要用户本地文件路径我想要我的项目上的文件路径公开

标签: php zend-framework forms upload populate


【解决方案1】:

当您说路径时,您的意思是 http 客户端中的路径? 你无权访问它。

如果您的问题是关于上传后文件的路径,您可以执行以下操作:

1) 元素必须是 Zend_Form_Element_File。

2) 在控制器中:

$form->file_path->receive(); //this will return true if the file was successfully received and false if not
$file_path_on_server = $form->file_path->getFileName(); // there you get the file name

文件将保留其原始名称。

【讨论】:

  • 当我尝试你的第一个代码并 var_dump 时。我收到一条错误消息,这意味着它正在检索任何内容,你知道为什么吗?
  • A false 表示文件未成功接收。不要忘记设置 Zend_Form_Element_File 的目的地 ($element->setDestination('path'))
【解决方案2】:

我遇到了同样的问题。 我通过在表单中​​使用隐藏字段来解决它,我在其中存储文件名并在修改操作中使用它

some action code
if ($request->isPost()) {
                if ($form->isValid($request->getPost())) {
                    if ('administrator' == $user->role) {
                        $oldFileName = $form->getElement('oldfilename')->getValue(); //the hidden field
                        $data = $form->getValues();
                        $model->populate($data);
                    if (file_exists('uploads/cv/' . $oldFileName)) {
                            $form->getElement('cv')->setIgnore(true); //this is my Form File Element - the file exists, I don't need to store the filename
                        } else { // if you want you can unlink $oldFileName
                            $upload = new Zend_File_Transfer_Adapter_Http();
                            $info = $upload->getFileInfo('cv');
                            $upload->setDestination("uploads/cv/");
                            if (file_exists('uploads/cv/' . $info['cv']['name'])) {
                                $newFileName = time() . rand(0, 100000) . "-" . $info['cv']['name']; // I need to avoid overwriting file
                            } else {
                                $newFileName = $info['cv']['name'];
                                $upload->addFilter('Rename', $newFileName);
                            }
                            try {
                                $upload->receive();
                            } catch (Zend_File_Transfer_Exception $e) {
                                $e->getMessage();
                            }
                        }
                        $model->save();
                        return $this->_helper->redirector('list');
                    } else {
                        //some error message
                        $this->_helper->redirector('list');
                    }
                } else { //form not valid
                    $this->view->form = $form;
                }
            } else {
                $model->find($id);
                $data = array();
                $data = $model->toArray();
                $data['oldfilename'] = $model->get_cv(); //the filename stored in db
                $form->getElement('cv')->setRequired(false);
                $form->populate($data);
                $this->view->form = $form;
            }

为了更好的编程,当然有很多事情可以修复......

【讨论】:

    【解决方案3】:
        public function addAction()
        {
    
            // Criação do Objeto Formulário
            $form = new Application_Form_Banner();
            $banners = new Application_Model_Banners();
            // Há dados para Tratamento?
            if ($this->getRequest()->isPost()) {
    
                // Pegamos os Dados como Foram Enviados
                $data = $this->getRequest()->getPost();
                $path = APPLICATION_PATH . '/../public/banners/';
                if (!is_dir($path)) {
                    mkdir($path, 0777, true);
                }
                if ($form->isValid($data)) {
    
                    try {
                        // Dados Filtrados pelo Formulário
                        $banners->getAdapter()->beginTransaction();
                        //gambi para renomear arquivos
                        $upload = new Zend_File_Transfer_Adapter_Http();
    //                $upload->addValidator('Size', false, array('min' => 100,
    //                    'max' => 1150000,
    //                    'bytestring' => true));
                        $upload->addValidator('ImageSize', false, array(
                            'minwidth' => 10, 'minheight' => 10,
                            'maxwidth' => 5500, 'maxheight' => 5500));
                        $filename = $upload->getFilename();
                        $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
                        $filename = basename($filename);
                        $newfilename = mt_rand() . '.' . $ext;
                        $upload->addFilter(new Zend_Filter_File_Rename(array('target' => $path . $newfilename, 'overwrite' => false)));
                        if (!$upload->isValid()) {
                            $this->_flashMessenger->addMessage(array('error' => 'O tamanho arquivo é muito grande.'));
                        }
                        if ($upload->receive()) {
    
                            //Para funcionar esse metodo $form->getValues(); precisa ficar abaixo do método $upload->receive()
                            $data = $form->getValues();
                            $data['banner_imagem'] = $newfilename;
                            // Qualquer Manipulação de Dados
                            $banners->insert($data);
                            $banners->getAdapter()->commit();
                            $form->reset(); //limpa os campos do form.
                            $this->_flashMessenger->addMessage(array('success' => 'Dados salvos com sucesso!'));
                        }
                    } catch (Exception $e) {
                        $this->_flashMessenger->addMessage(array('error' => $e->getMessage()));
                    } catch (Zend_File_Transfer_Exception $e) {
                        $this->_flashMessenger->addMessage(array('error' => $e->getMessage()));
                    } catch (Zend_Db_Table_Exception $e) {
                        $banners->getAdapter()->rollBack();
                        $this->_flashMessenger->addMessage(array('error' => $e->getMessage()));
                    }
                } else {
                    $form->populate($data);
                }
            }
            // Envio para a Camada de Visualização
            $this->view->form = $form;
        }
    
        public function editAction()
        {
            // Criação do Objeto Formulário
            $form = new Application_Form_Banner();
            $banners = new Application_Model_Banners();
            $form->getElement('banner_imagem')->setRequired(false);
            $form->getElement('banner_imagem')->setIgnore(true);
    
            $id = $this->_request->getParam('id');
            $data = $banners->find($id)->current()->toArray();
            $path = APPLICATION_PATH . '/../public/banners/';
            $banner_imagemdb = $data['banner_imagem'];
    //        Zend_Debug::dump( $form->getValues());
            // Há dados para Tratamento?
            if ($this->getRequest()->isPost()) {
    
                // Pegamos os Dados como Foram Enviados
                $data = $this->getRequest()->getPost();
    
    //            $data = $form->getValues();
    //            Zend_Debug::dump($this->getRequest()->getPost());
    //            print($form->getValue('banner_imagem'));
    //            $banner_imagem = $form->getValue('banner_imagem');
    
    
                if (!is_dir($path)) {
                    mkdir($path, 0777, true);
                }
                if ($form->isValid($data)) {
    //                Zend_Debug::dump($this->getRequest()->getPost());
                    try {
    
                        // Dados Filtrados pelo Formulário
                        $banners->getAdapter()->beginTransaction();
    //                    Zend_Debug::dump($banner_imagem);
                        if ($form->banner_imagem->isUploaded()) {
                            //gambi para renomear arquivos
                            $upload = new Zend_File_Transfer_Adapter_Http();
                            $upload->addValidator('Size', false, array('min' => 100,
                                'max' => 11150000,
                                'bytestring' => true));
                            $upload->addValidator('ImageSize', false, array(
                                'minwidth' => 10, 'minheight' => 10,
                                'maxwidth' => 5500, 'maxheight' => 5500));
                            $filename = $upload->getFilename();
                            $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
                            $filename = basename($filename);
                            $newfilename = mt_rand() . '.' . $ext;
                            $upload->addFilter(new Zend_Filter_File_Rename(array('target' => $path . $newfilename, 'overwrite' => false)));
                            if (!$upload->isValid()) {
                                $this->_flashMessenger->addMessage(array('error' => 'O tamanho arquivo é muito grande.'));
                            }
                            if ($upload->receive()) {
                                //apaga imagem antiga            
                                @unlink($path . $banner_imagemdb);
    
                                //Para funcionar esse metodo $form->getValues(); precisa ficar abaixo do método $upload->receive()
                                $data = $form->getValues();
                                $data['banner_imagem'] = $newfilename;
                                // Qualquer Manipulação de Dados
                                $where = $banners->getAdapter()->quoteInto("banner_id = ?", $id);
                                $banners->update($data, $where);
                                $banners->getAdapter()->commit();
                                $form->reset(); //limpa os campos do form.
                                $this->_flashMessenger->addMessage(array('success' => 'Dados salvos com sucesso!'));
                            }
                        } else {
                            $form->getElement('banner_imagem')->setRequired(false);
                            $form->getElement('banner_imagem')->setIgnore(true);
                            //Para funcionar esse metodo $form->getValues(); precisa ficar abaixo do método $upload->receive()
                            $data = $form->getValues();
                            $data['banner_imagem'] = $banner_imagemdb;
                            // Qualquer Manipulação de Dados
                            $where = $banners->getAdapter()->quoteInto("banner_id = ?", $id);
                            $banners->update($data, $where);
                            $banners->getAdapter()->commit();
                            $form->reset(); //limpa os campos do form.
                            $this->_flashMessenger->addMessage(array('success' => 'Dados salvos com sucesso!'));
                        }
                    } catch (Exception $e) {
                        $this->_flashMessenger->addMessage(array('error' => $e->getMessage()));
                    } catch (Zend_File_Transfer_Exception $e) {
                        $this->_flashMessenger->addMessage(array('error' => $e->getMessage()));
                    } catch (Zend_Db_Table_Exception $e) {
                        $banners->getAdapter()->rollBack();
                        $this->_flashMessenger->addMessage(array('error' => $e->getMessage()));
                    }
                }
            }
    
    //        Zend_Debug::dump($data);
            $form->populate($data);
            $imagePreview = $form->createElement('image', 'image_preview');
    // element options
            $imagePreview->setLabel('Preview Image: ');
            $imagePreview->setAttrib('style', 'width:200px;height:auto;');
    // add the element to the form
            $imagePreview->setOrder(4);
            $imagePreview->setImage('/public/banners/' . $data['banner_imagem']);
    
            $form->addElement($imagePreview);
    
    
            // Envio para a Camada de Visualização
            $this->view->form = $form;
        }
    
        assim da certo
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2023-03-04
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 2012-08-10
      相关资源
      最近更新 更多