Php Zend_表单无法验证IE10中的可选文件
TL;DR:Zend_Form_Element_文件与IE10的关系不好 好吧,请耐心听我讲述我遇到过的最糟糕的虫子之一的故事。(仅适用于IE10) 我正在使用Zend_表单(Zend Framework 1.12)和Zend_表单元素文件:Php Zend_表单无法验证IE10中的可选文件,php,zend-framework,file-upload,zend-form,internet-explorer-10,Php,Zend Framework,File Upload,Zend Form,Internet Explorer 10,TL;DR:Zend_Form_Element_文件与IE10的关系不好 好吧,请耐心听我讲述我遇到过的最糟糕的虫子之一的故事。(仅适用于IE10) 我正在使用Zend_表单(Zend Framework 1.12)和Zend_表单元素文件: $file = (new Zend_Form_Element_File('file')) ->setRequired(false); 在适当的时候,我还使用AJAX或iFrame。(这是一个新的开发,以前我只使用了一个iframe[这个bu
$file = (new Zend_Form_Element_File('file'))
->setRequired(false);
在适当的时候,我还使用AJAX或iFrame。(这是一个新的开发,以前我只使用了一个iframe[这个bug是在那个版本中发现的],后来我移动了iframe以检测XHR2特性)
我们有一个表单,AJAXly将文件和其他变量提交给服务器,服务器试图通过Zend_表单验证它。没什么大不了的。Chrome和Firefox发送Zend检测到并没有问题的空文件,IE没有发送任何与文件相关的内容,现在发送一个名为file的空参数(不是空文件),Zend_Form说“文件太大了”
文件数组为空,因此我实施了Zend问题上建议的修补程序,以获得:
但是,由于$check
的计算结果不是空的
问题仍然存在
相关请求标题:
X-Requested-With: XMLHttpRequest
Accept: text/html, */*; q=0.01
Content-Type: multipart/form-data; boundary=---------------------------7dd299161d06c6
Content-Length: 580
请求机构:
-----------------------------7dd299161d06c6
Content-Disposition: form-data; name="entryId"
9
-----------------------------7dd299161d06c6
Content-Disposition: form-data; name="csrf"
b9774f3998695465d9b3079eb028e342
-----------------------------7dd299161d06c6
Content-Disposition: form-data; name="description"
test
-----------------------------7dd299161d06c6
Content-Disposition: form-data; name="MAX_FILE_SIZE"
2097152
-----------------------------7dd299161d06c6
Content-Disposition: form-data; name="file"
-----------------------------7dd299161d06c6--
表格信息:
{"file":{"fileUploadErrorIniSize":"File 'file' exceeds the defined ini size"}}
有人知道此问题的解决方案吗?您可能希望看到此问题:
当我们遇到这个问题时,我们只是强制iFrame:true,这就成功了。这让我有点难过,但它奏效了。:) 您可能希望看到此问题:
当我们遇到这个问题时,我们只是强制iFrame:true,这就成功了。这让我有点难过,但它奏效了。:) 您可以添加一个变通方法来覆盖Zend_表单的isValid()方法。有一个合法的bug,当没有上传任何文件时,它会产生相同的错误,但它仍然试图验证。也许这会帮助其他人
public function isValid($data) {
$valid = parent::isValid($data);
$errorCount = 0;
foreach($this->getElements() as $elem) {
if ($elem->hasErrors()) {
$errorCount++;
}
// Related issues:
// http://framework.zend.com/issues/browse/ZF-12159
// http://framework.zend.com/issues/browse/ZF-10279
// http://framework.zend.com/issues/browse/ZF-12189
if ($elem instanceof Zend_Form_Element_File && !$elem->isRequired() && !isset($_FILES[$elem->getName()]) && $elem->hasErrors()) {
$elem->clearErrorMessages();
$elem->setTransferAdapter( 'Http' ); // reset any errors that may be on the transfer adapter
$errorCount--;
}
}
if ($this->_errorsForced) {
return false;
}
if ($errorCount==0) {
$this->_errorsExist = false;
}
return $errorCount==0;
}
您可以添加一个变通方法来覆盖Zend_表单的isValid()方法。有一个合法的bug,当没有上传任何文件时,它会产生相同的错误,但它仍然试图验证。也许这会帮助其他人
public function isValid($data) {
$valid = parent::isValid($data);
$errorCount = 0;
foreach($this->getElements() as $elem) {
if ($elem->hasErrors()) {
$errorCount++;
}
// Related issues:
// http://framework.zend.com/issues/browse/ZF-12159
// http://framework.zend.com/issues/browse/ZF-10279
// http://framework.zend.com/issues/browse/ZF-12189
if ($elem instanceof Zend_Form_Element_File && !$elem->isRequired() && !isset($_FILES[$elem->getName()]) && $elem->hasErrors()) {
$elem->clearErrorMessages();
$elem->setTransferAdapter( 'Http' ); // reset any errors that may be on the transfer adapter
$errorCount--;
}
}
if ($this->_errorsForced) {
return false;
}
if ($errorCount==0) {
$this->_errorsExist = false;
}
return $errorCount==0;
}
我已经强制iframe true,但它不起作用,我已经修复了Zend本身的bug(与问题类似的补丁,但在Zend_文件上传适配器Http中)我已经强制iframe true,但它不起作用,我已经修复了Zend本身的bug(与问题类似的补丁,但在Zend_文件上传适配器Http中)这里是一个通过破解Zend_表单来解决问题的变通方法-@Clay IIRC,我使用了类似的修复方法。如果你想把它作为一个答案发布,我很乐意接受它作为一个答案发布:-)这里有一个解决办法,通过黑客Zend_表单来修复这个问题-@Clay IIRC,我使用了类似的修复方法。如果你想把它作为一个答案发布,我很乐意接受它作为一个答案发布:-)