Php Zend_表单无法验证IE10中的可选文件

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

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[这个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,我使用了类似的修复方法。如果你想把它作为一个答案发布,我很乐意接受它作为一个答案发布:-)