2

我注意到我认为 Zend_Form_Element_File 的错误。其他人可以测试它并告诉我他们是否得到相同的结果。在失败的表单上,除了 Element_File 的值之外的所有字段都会重新填充。

我的表单有 2 个文本字段和 1 个文件字段,都是必需的。

$name = new Zend_Form_Element_Text('name');
$name->setLabel('Name');
$name->setRequired(true);
$this->addElement($name);

$name2 = new Zend_Form_Element_Text('name2');
$name2->setLabel('Name2');
$name2->setRequired(true);
$this->addElement($name2);

$file = new Zend_Form_Element_File('file');
$file->setLabel('Test file')
     ->setDestination(APPLICATION_PATH);
$file->setRequired(true);
$this->addElement($file);

$submit = new Zend_Form_Element_Submit('submit');       
$submit->setLabel('Submit')
$this->addElement($submit);  

通常,当表单失败时,它会自动填充已填写的任何字段,但它不适用于文件字段,除了更正需要更正的其他字段外,我还必须再次手动选择文件。

首先,其他人可以证实这一点吗?

我认为问题与文件字段的标记有关。我看到第一个<input>是文件大小,然后文件本身进入第二个<input>

<dd>
<input type="hidden" id="MAX_FILE_SIZE" value="67108864" name="MAX_FILE_SIZE">
<input type="file" id="file" name="file">
</dd>

当提交有效表单时,发布数据仅显示<input>文件字段的第一个,即大小[MAX_FILE_SIZE] => 67108864而不是文件本身。

Array ( 
   [name] => test 
   [MAX_FILE_SIZE] => 67108864
) 

当表单有效时,上传工作正常,所以我知道文件字段本身没有任何问题,但在表单失败的情况下(正确的文件字段但其他字段之一无效),文件字段是唯一的字段表单呈现时不会重新填充。那么这是一个错误吗?当文件没有问题时必须重新添加文件很烦人。有没有人可以想到的解决方法。我尝试在表单无效的情况下进行手动填充,希望它会强制填充文件字段,就像这样,但它也不起作用。

   if(//valid form){
      //process the form
   } else {
       $form->populate($this->_request->getPost());     
   }
4

2 回答 2

4

这不是Zend_Form. 这是一个限制 HTML 文件上传输入元素。出于安全原因,浏览器将忽略文件输入并设置值。如果没有这个限制,恶意网站可能会在文件输入中预先填充诸如

/etc/password
c:\Windows\Location\Of\Sensative\File.txt

然后自动将硬盘驱动器的内容发布到任何服务器。

一种常见的解决方法是使用类似于 jQuery 的ajax 表单插件之类的东西通过 ajax 请求发布上传。当它失败时,文件上传保持选中状态,因为没有页面刷新。

于 2011-01-24T08:54:52.940 回答
1

这不是错误。一些 Zend_Form 元素没有重新填充功能。这适用于某些特定元素(密码,文件,...)。我认为这是正确的。

于 2011-01-24T08:49:45.363 回答