1

TL如果驗證失敗,與可選文件; DR:Zend_Form_Element_File不打尼斯IE10Zend_Form的IE10中

好吧,包涵我,而我解開這個故事我一生中遇到最嚴重的錯誤之一。 (僅適用於IE10

我用Zend_Form的(Zend框架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的問題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"}} 

有誰知道一個解決這個問題的?

+0

這裏是黑客Zend_Form的修復問題的解決方法 - http://stackoverflow.com/a/32472069/5207687 – Clay

+1

@Clay IIRC,我用了一個類似的修復。如果你想發佈這個答案,我很樂意接受它 – Navarr

+0

發佈它作爲答案:-) – Clay

回答

1

下面是一個解決方法,您可以添加以覆蓋Zend_Form的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; 
} 
0

您可能希望看到這個問題:Form Bug in JS

當我們碰到了這一點,我們只是被迫的iFrame:真實的,沒有的伎倆。這讓我有點難過,但它有效。 :)

+0

我已經強制iframe真實,它不工作,我已經修復了Zend內的錯誤本身(類似的問題補丁,但在Zend_File_Upload_Adapter_Http中) – Navarr