Php 如何将$\u文件和$\u POST数据传递到表单中?
到目前为止,我知道这是将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() ); 但事实并非如此。通过查看框架源代码,我确认它不应该。所以我
$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
是一个基于上传文件信息的数组。文件名、扩展名等。。ZendsgetFileInfo
以类似的方式输出该信息。虽然我已经有一段时间没有玩过它了,但它值得一看
示例概念(我知道多个文件上传的更多信息,但只适用于一个,好的概念可以保留,以防万一您想添加第二个或更多文件)
在尝试使用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