我在使用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'));
}
}
答案 0 :(得分: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);
}
希望这有助于您开始使用。
答案 1 :(得分:1)
问题是我在上传之前使用以下行访问表单数据:
// get the values
$values = $form->getValues();
现在,在模型中上传之后放置,并且使用以下内容访问文件数据:
$file = $upload->getFileInfo();
答案 2 :(得分:0)
为了完成这项工作,您需要在表单元素中设置setValueDisabled = true
,否则只要您调用$form->getValues()
它就会将文件上传到系统临时文件夹。
目前,您甚至在设置目标之前调用$form->getValues()
,因此文件将变为默认值(系统临时值)。