Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将$\u文件和$\u POST数据传递到表单中?_Php_Zend Framework2 - Fatal编程技术网

Php 如何将$\u文件和$\u POST数据传递到表单中?

Php 如何将$\u文件和$\u POST数据传递到表单中?,php,zend-framework2,Php,Zend Framework2,到目前为止,我知道这是将post中的数据传递到表单中的方法 $form->setData( $this->getRequest()->getPost() ); 我想这可能有用 $form ->setData( $this->getRequest()->getPost() ) ->setData( $this->getRequest()->getFiles() ); 但事实并非如此。通过查看框架源代码,我确认它不应该。所以我

到目前为止,我知道这是将post中的数据传递到表单中的方法

$form->setData( $this->getRequest()->getPost() );
我想这可能有用

$form
    ->setData( $this->getRequest()->getPost() )
    ->setData( $this->getRequest()->getFiles() );
但事实并非如此。通过查看框架源代码,我确认它不应该。所以我考虑将文件数据合并到post数据中。这肯定不是理想的解决方案吗?getPost()和getFiles()并不是返回易于合并的数组,而是返回参数对象


请注意,这是Zend Framework 2特有的。

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

例如:

// 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];
}

您是否尝试过
getFileInfo
现在就知道或注意到您使用Zend。通常基于每个文件
$\u file
是一个基于上传文件信息的数组。文件名、扩展名等。。Zends
getFileInfo
以类似的方式输出该信息。虽然我已经有一段时间没有玩过它了,但它值得一看

示例概念(我知道多个文件上传的更多信息,但只适用于一个,好的概念可以保留,以防万一您想添加第二个或更多文件)


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


我正在使用数组\u合并

    $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

了解您正在使用的框架也会很有帮助。作为标准的
HTML/PHP
表单,当您发布包含文件输入的多部分/表单数据表单时,
$\u文件
将起作用。您的代码snipplet似乎是独立PHP之外的东西的一部分,MVC、CMS,甚至可能是表单处理类,但知道具体什么可以帮助您全面回答这个问题。@chris它已经被标记为zend-framework2。希望对你有所帮助。有效的一点,远到我经常不注意标签。谢谢Noel。一个足够简洁的解决方案,但是我正在寻找适合Zend Framework 2的东西,我会小心使用
$\u REQUEST
它在开发中很好,但在生产中可能会很昂贵。如果您没有很好地验证它们,则更是如此。因为
$\u REQUEST
是一个全局变量,它本质上可以是任何匹配类型的东西,所以我甚至可以传递一个COOKIE,并让它作为一个例子在foreach中运行。抱歉,我不知道Zend的任何情况,但希望这可能会有所帮助,祝好运!您完全正确,chris必须采取步骤验证此处的输入。@Noel有一个小点,但$$?来吧,它和我一样甜。(希望不要太高人一等):)谢谢克里斯。我现在正试图实现这一点。在ZF2中,这是这样使用的:使用Zend\File\Transfer\Adapter\Http作为ZendFileTransferAdapterHttp$upload=new ZendFileTransferAdapterHttp();。。。但是,我的解决方案在控制器中工作,我希望将其封装在表单对象和输入过滤器中。我希望表单能够更紧密地耦合以节省时间,但目前还不流行这样说。
protected function getPostedData()
{
    if ( is_null($this->postedData) )
    {
        $this->postedData = array_merge(
            (array) $this->getRequest()->getPost(),
            (array) $this->getRequest()->getFiles()
        );
    }
    return $this->postedData;
}
    $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