2012-07-27 19 views
2

到目前为止,这是我所知道的将数据从帖子传递到表单的方式。

$form->setData($this->getRequest()->getPost()); 

我认为这可能工作

$form 
    ->setData($this->getRequest()->getPost()) 
    ->setData($this->getRequest()->getFiles()); 

它不。通过框架来源,我确认它不应该。所以我在考虑将文件数据合并到发布数据中。当然,这不可能是理想的解决方案?它并不像getPost()和getFiles()方便地返回可合并数组,它们返回Parameter对象。

请注意,这是Zend Framework 2的具体内容。

+0

这将有助于了解您所使用的框架,以及。当你用文件输入发布multipart/form-data表单时,标准的'HTML/PHP'形式可以使用'$ _FILE'。你的代码snipplet似乎是独立PHP之外的一部分,无论是MVC,CMS,还是甚至表单处理类,但知道什么可以帮助整体回答这个问题。 – chris 2012-07-27 15:34:12

+0

@chris它已经被标记为zend-framework2。希望有所帮助。 – 2012-07-27 15:51:50

+0

有效点,远到经常我不注意标签.. – chris 2012-07-27 15:55:50

回答

3

你试过getFileInfo现在知道或支付的头脑,你使用Zend的事实。通常在每个文件的基础上$_FILE是一个基于正在上传的文件的信息的数组。文件名,扩展名等。Zends getFileInfo以类似的方式输出该信息。虽然我还没有玩过它,但它的价值还是值得研究的

示例概念(更多用于多文件上传我知道,但适用于一个很好的概念,只需添加第二个或更多文件在路上)

$uploads = new Zend_File_Transfer_Adapter_Http(); 
$files = $uploads->getFileInfo(); 

foreach($files as $file => $fileInfo) { 
    if ($uploads->isUploaded($file)) { 
     if ($uploads->isValid($file)) { 
      if ($uploads->receive($file)) { 
       $info = $uploads->getFileInfo($file); 
       $tmp = $info[$file]['tmp_name']; 
       $data = file_get_contents($tmp); 
       // here $tmp is the location of the uploaded file on the server 
       // var_dump($info); to see all the fields you can use 
      } 
     } 
    } 
} 
+0

谢谢克里斯。我现在试图实现这一点。在ZF2中,这是这样使用的:使用Zend \ File \ Transfer \ Adapter \ Http作为ZendFileTransferAdapterHttp; .......$ upload = new ZendFileTransferAdapterHttp(); – 2012-07-30 10:41:02

+0

...但是我的解决方案在控制器中工作,我想将它封装在表单对象和输入过滤器中。目前不太流行的是我希望形式更紧密地联系起来以节省时间。 – 2012-07-30 10:44:19

0

我使用变量变量如this文章解释创建变量,然后将它们作为每个表单条目的值进行回显。

例如:

// create array of GET/POST variables then convert each variable to a local variable 
$fields = array_keys($_REQUEST); 
foreach ($fields as $field) { 
    $$field = $_REQUEST[$field]; 
} 
+0

谢谢诺埃尔。一个足够整洁的解决方案,但是我正在寻找Zend Framework 2 – 2012-07-27 15:54:17

+0

的东西我会小心使用'$ _REQUEST'它的开发很好,但在生产中可能是昂贵的。更有甚者,如果你没有足够好地验证它们。原因'$ _REQUEST'是一个全局变量,基本上可以是任何具有匹配类型的变量,所以我可以传递一个COOKIE,并通过这个foreach作为例子。 – chris 2012-07-27 15:55:18

+0

对不起tomwrong我对Zend一无所知,但希望这可以帮助,goodluck!你完全正确的克里斯步骤将不得不采取验证输入在这里。 – Noel 2012-07-27 17:42:09

3

试图使用Zend的文件传输适配器后,我去了一个在控制器中的解决方法。我认为表单类中的setData()应该将这些项合并到数据中,而不是替换它们。 (恕我直言)

protected function getPostedData() 
{ 
    if (is_null($this->postedData)) 
    { 
     $this->postedData = array_merge(
      (array) $this->getRequest()->getPost(), 
      (array) $this->getRequest()->getFiles() 
     ); 
    } 
    return $this->postedData; 
} 
1

我使用array_merge

$form = $this->getForm('my_form'); 
    $request = $this->getRequest(); 

    if($request->isPost()) 
    { 

     $file = $this->params()->fromFiles('name_of_file'); 
     $form->setData(array_merge(
      $request->getPost()->toArray(), 
      array('arquivo' => $file['name']) 
     )); 

     if ($form->isValid()) { 
     // now i can validate the form field 
相关问题