8

當我使用Krajees Bootstrap Fileinput上傳文件時,我執行文件的服務器端驗證。當出現錯誤時,我輸出一個簡單的{error:'Something went wrong'} JSON對象。該插件完美地顯示錯誤。Bootstrap Fileinput在第二次上傳時不會再發送文件

但之後:當我再次按「上傳」後,被調用的提交PHP腳本中的$_FILES數組爲空。這意味着,即使插件已通知發生了錯誤,插件也不會再發送該文件。

爲什麼插件只會上傳文件一次即使它檢測到有錯誤?有沒有方法可以「重置」文件的「上傳狀態」? (我只上傳一個文件)。

我已經檢查了file events但他們沒有把我帶到期望的結果,而是他們破壞了整個上傳表格,某些按鈕被突然禁用等等。

+0

你能否在plunkr中提供演示,因爲現在插件網站正在關閉 –

+0

@PareshGami我現在不能創建一個片段,但基本上它正是它應該做的。但是,我也問過Kartik,他回答說目前這是不可能的:https://github.com/kartik-v/bootstrap-fileinput/issues/637 –

+1

@FlorianMüller對你來說還沒有解決?我認爲https://github.com/kartik-v/bootstrap-fileinput/blob/master/js/fileinput.js#L1534是你應該能夠很容易地編寫你的重試邏輯的地方:-) – Angad

回答

2

我終於找到了確切的點,那裏的問題可以得到解決:

line 1705 in the function updateUploadLog,功能self.updateStack被調用。這個調用只是清除文件堆棧並導致稍後的進程清空表單輸入。簡單地說出這條線就行,但只有在成功後重新加載,因爲在找到錯誤時也會調用fnSuccess

@Angad非常感謝你爲你的解決方案觸發輸入,幸虧我發現再次開始檢索的地方;)

+2

+1我仍然無法克服的事實,我的線標記接近第二種方法 - 這是這樣的事情讓計算機編程無限樂趣 – Angad

3

我看到Github的問題說,這是目前不支持,但似乎相對簡單的分叉這個項目,並將其彎曲到您的需求。所有的fnError =的你會發現在Cmd + F搜索裏面fileinput.js是你需要看的地方。

例如採用這裏:https://github.com/kartik-v/bootstrap-fileinput/blob/d5ed3ee989edbd5d67b8cf4bdadc9f3c18609965/js/fileinput.js#L1897

這是批處理文件上傳,目前看起來是這樣的:

fnError = function (jqXHR, textStatus, errorThrown) { 
    var outData = self._getOutData(jqXHR), errMsg = self._parseError(jqXHR, errorThrown); 
    self._showUploadError(errMsg, outData, 'filebatchuploaderror'); 
    self.uploadFileCount = total - 1; 
    if (!self.showPreview) { 
     return; 
    } 
    self._getThumbs().each(function() { 
     var $thumb = $(this), key = $thumb.attr('data-fileindex'); 
     $thumb.removeClass('file-uploading'); 
     if (self.filestack[key] !== undefined) { 
      self._setPreviewError($thumb); 
     } 
    }); 
    self._getThumbs().removeClass('file-uploading'); 
    self._getThumbs(' .kv-file-upload').removeAttr('disabled'); 
    self._getThumbs(' .kv-file-delete').removeAttr('disabled'); 
}; 

我會嘗試修改該到:

fnError = function (jqXHR, textStatus, errorThrown) { 
    if (!myError.equals(textStatus)) { // A service-like impl. injection would be sexier 
     var outData = self._getOutData(jqXHR), errMsg = self._parseError(jqXHR, errorThrown); 
     self._showUploadError(errMsg, outData, 'filebatchuploaderror'); 
     self.uploadFileCount = total - 1; 
     if (!self.showPreview) { 
      return; 
     } 
     self._getThumbs().each(function() { 
      var $thumb = $(this), key = $thumb.attr('data-fileindex'); 
      $thumb.removeClass('file-uploading'); 
      if (self.filestack[key] !== undefined) { 
       self._setPreviewError($thumb); 
      } 
     }); 
     self._getThumbs().removeClass('file-uploading'); 
     self._getThumbs(' .kv-file-upload').removeAttr('disabled'); 
     self._getThumbs(' .kv-file-delete').removeAttr('disabled'); 
    } else { 
     self._ajaxSubmit(fnBefore, fnSuccess, fnComplete, function() { 
      // TODO: Second time failure - handle recursively or differently? :-) 
     ); 
    } 
}; 

希望這可以幫助!

+0

我解決了它有點quick'n'dirtier(見我的答案下面),但這種方法也符合需求,非常感謝你! –

相關問題