1

TL;DR: Zend_Form_Element_File 在IE10上表现不佳

好吧,请耐心等待我解开这个关于我遇到过的最糟糕的错误之一的故事。(仅适用于IE10

我正在使用 Zend_Form (Zend Framework 1.12) 和 Zend_Form_Element_File:

$file = (new Zend_Form_Element_File('file'))
    ->setRequired(false);

我还在适当的时候使用jQuery Form Plugin来使用 AJAX 或 iFrame。(这是一个新的开发,以前我只使用 iframe [并且在那个版本中发现了这个错误],我后来将 iframe 移动到了 XHR2 Feature Detected)。

所以我们有这个表单,AJAXly 将文件和其他变量提交给服务器,服务器尝试通过 Zend_Form 验证它。没什么大不了。Chrome 和 Firefox 发送 Zend 检测到并且没有问题的空文件,IE 没有发送与文件相关的任何内容,现在正在发送一个名为 file 的空参数(不是空文件)并且 Zend_Form 说“文件太大。”

文件数组是空的,所以我实现了 Zend Issue ZF-12189上建议的补丁来获得:

    $check = $this->_getFiles($files, false, true);
    if (empty($check)) {
        if ($this->_options['ignoreNoFile']) {
            return true;
        }
        return false;
    }

但由于问题仍然存在,$check因此没有进行评估。empty

相关请求标头:

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"}}

有谁知道这个问题的解决方案?

4

2 回答 2

1

这是您可以添加以覆盖 Zend_Form 的 isValid() 方法的解决方法。那里有一个合法的错误,当没有文件上传时会产生相同的错误,但它仍然会尝试验证。也许这会帮助那里的人。

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;
}
于 2017-02-14T23:07:30.233 回答
0

你可能想看看这个问题:Form Bug in JS

当我们遇到这个问题时,我们只需要强制 iFrame: true 就可以了。这让我有点难过,但它确实有效。:)

于 2013-06-28T16:25:40.400 回答