0

Zend Framework を使用してファイルをアップロードする際に問題が発生しています。以下にリストされているフォームを作成し、ファイルをアップロードしようとしているモデルにデータ入力を渡しました。ただし、IT はファイル名を取得するだけのようで、アップロード ディレクトリへのアップロードに失敗します。

<?php

class Application_Form_Admin extends Zend_Form
{

    public function init()
    {
        // Set the method for the display form to POST
        $this->setMethod('post');

        // set the data format
        $this->setAttrib('enctype', 'multipart/form-data');

        // Add the title
        $this->addElement('file', 'ogimage', array(
            'label'      => 'Default App Image',
            'required'   => false
        ));

        // Add the submit button
        $this->addElement('submit', 'submit', array(
            'ignore'   => true,
            'label'    => 'Submit',
        ));

        // And finally add some CSRF protection
        $this->addElement('hash', 'csrf', array(
            'ignore' => true,
        ));

    }


}

コントローラ

<?php

class AdminController extends Zend_Controller_Action
{

    /**
     * @var The Admin Model
     *
     *
     */
    protected $app = null;

    /**
     * init function.
     *
     * @access public
     * @return void
     *
     *
     */
    public function init()
    {

        // get the model
        $this->app = new Application_Model_Admin();

    }

    /**
     * indexAction function.
     *
     * @access public
     * @return void
     *
     *
     */
    public function indexAction()
    {
        // get a form
        $request = $this->getRequest();
        $form    = new Application_Form_Admin();

        // pre populate form
        $form->populate((array) $this->app->configData());

        // handle form submissions
        if($this->getRequest()->isPost()) {

            if($form->isValid($request->getPost())) {

                // save the clips
                $this->app->saveConfig($form);

                // redirect
                //$this->_redirect('/admin/clips');

            }

        }

        // add the form to the view
        $this->view->form = $form;
    }

}

モデル

class Application_Model_Admin
{

    /**
    * @var Bisna\Application\Container\DoctrineContainer
    */
    protected $doctrine;

    /**
    * @var Doctrine\ORM\EntityManager
    */
    protected $entityManager;

    /**
    * @var ZC\Entity\Repository\FacebookConfig
    */
    protected $facebookConfig;

    /**
     * Constructor
     */
    public function __construct(){

        // get doctrine and the entity manager
        $this->doctrine     = Zend_Registry::get('doctrine');
        $this->entityManager    = $this->doctrine->getEntityManager();

        // include the repository to get data
        $this->facebookConfig   = $this->entityManager->getRepository('\ZC\Entity\FacebookConfig');

    }


    /**
     * saveConfig function.
     * 
     * @access public
     * @param mixed $form
     * @return void
     */
    public function saveConfig($form){

        // get the entity
        $config = new \ZC\Entity\FacebookConfig();

        // get the values
        $values = $form->getValues();

        // upload the file
        $upload = new Zend_File_Transfer_Adapter_Http();
        $upload->setDestination(APPLICATION_PATH . '/../uploads/');
        try {
            // upload received file(s)
            $upload->receive();
        } catch (Zend_File_Transfer_Exception $e) {
            $e->getMessage();

        }

// get some data about the file
$name = $upload->getFileName($values['ogimage']);
$upload->setOptions(array('useByteString' => false));
//$size = $upload->getFileSize($values['ogimage']);
//$mimeType = $upload->getMimeType($values['ogimage']);
print_r('<pre>');var_dump($name);print_r('</pre>');
//print_r('<pre>');var_dump($size);print_r('</pre>');
//print_r('<pre>');var_dump($mimeType);print_r('</pre>');
die;
// following lines are just for being sure that we got data
print "Name of uploaded file: $name 
";
print "File Size: $size 
";
print "File's Mime Type: $mimeType";

// New Code For Zend Framework :: Rename Uploaded File
$renameFile = 'file-' . uniqid() . '.jpg';
$fullFilePath = APPLICATION_PATH . '/../uploads/' . $renameFile;

// Rename uploaded file using Zend Framework
$filterFileRename = new Zend_Filter_File_Rename(array('target' => $fullFilePath, 'overwrite' => true));
$filterFileRename->filter($name);

        // loop through the clips and add to object
        foreach($values as $k => $column){
            $config->__set($k, $column);
        }

        // save or update the clips object
        if(empty($values['id'])){
            $this->entityManager->persist($config);
        } else {
            $this->entityManager->merge($config);
        }

        // execute the query
        $this->entityManager->flush();

        // set the id
        $form->getElement('id')->setValue($config->__get('id'));

    }

}

4

3 に答える 3

2

問題は、アップロード前に次の行でフォームデータにアクセスしていたことです。

// get the values
$values = $form->getValues();

これはモデルのアップロード後に配置され、代わりに次のようにファイル データにアクセスします。

$file = $upload->getFileInfo();
于 2012-08-23T13:52:47.250 に答える
1

ファイルを必要な場所に移動する必要があります。これは、コードで使用する小さなスニペットです

if($form->isValid($request->getPost())) {
 $uploadedFile = new Zend_File_Transfer_Adapter_Http();
 $uploadedFile->setDestination(APPLICATION_PATH.'/../public_uploads/');
 if($uploadedFile->receive()) {
  //Code to process the file goes here 
 } else {
  $errors = $uploadedFile->getErrors();
 }
 $this->app->saveConfig($form);
}

これが開始に役立つことを願っています。

于 2012-08-22T17:37:43.357 に答える
0

これを機能させるには、フォーム要素を設定する必要がありsetValueDisabled = trueます。そうしないと、呼び出すとすぐに$form->getValues()ファイルがシステム一時フォルダーにアップロードされます。

現在、宛先を設定する前に呼び出し$form->getValues()ているため、ファイルはデフォルト(システム温度)になります。

于 2012-08-23T09:59:40.800 に答える