8

Wenn ich eine Datei mit Krajees Bootstrap Fileinput hochlade, führe ich eine serverseitige Überprüfung der Datei durch. Wenn etwas schief geht, gebe ich ein JSON-Objekt einfach mit {error:'Something went wrong'} aus. Das Plugin zeigt den Fehler perfekt an.Bootstrap Fileinput sendet die Datei beim zweiten Upload nicht erneut

Aber dann: Wenn ich gleich danach erneut "upload" drücke, ist das $_FILES Array im aufgerufenen PHP-Skript leer. Das bedeutet, dass das Plugin die Datei nicht erneut sendet, selbst wenn es einen Fehler gemeldet hat.

Warum sollte das Plugin die Datei nur einmal hochladen, obwohl es einen Fehler entdeckt hat? Gibt es irgendwelche Methoden, die den "hochgeladenen Zustand" der Datei "zurücksetzen" können? (Ich lade nur eine Datei hoch).

Ich habe bereits die überprüft, aber keine von ihnen brachte mich zu dem gewünschten Ergebnis, stattdessen zerstörten sie irgendwie das gesamte Upload-Formular mit bestimmten Tasten, die plötzlich deaktiviert wurden und so weiter.

+0

Können Sie Demo in Plunkr bereitstellen, da Plugin-Website ist jetzt –

+0

@PareshGami Ich kann jetzt nicht ein Snippet erstellen, aber im Grunde ist es genau das, was es tun soll. Allerdings habe ich auch Kartik gefragt und er hat geantwortet, dass das momentan nicht möglich ist: https://github.com/kartik-v/bootstrap-fileinput/issues/637 –

+1

@ FlorianMüller ist das für dich noch ungelöst? Ich denke, https://github.com/kartik-v/bootstrap-fileinput/blob/master/js/fileinput.js#L1534 ist, wo Sie in der Lage sein sollten, Ihre Retry-Logik ganz einfach zu schreiben :-) – Angad

Antwort

2

fand ich endlich den genauen Punkt aus, wo das Problem gelöst werden könnte:

Auf line 1705 in the function updateUploadLog wird die Funktion self.updateStack genannt. Dieser Aufruf löscht den Dateistapel einfach und veranlasst einen späteren Prozess, die Formulareingabe zu leeren. Das einfache Auskommentieren dieser Zeile macht den Trick, aber nur, wenn Sie nach Erfolg neu laden, denn irgendwie wird auch fnSuccess aufgerufen, wenn ein Fehler gefunden wird.

@Angad Vielen Dank für Ihre Lösung Eingang Auslösen dank, dass ich einen Platz gefunden, um die Suche erneut zu starten;)

+2

+1 Ich kann immer noch nicht über die Tatsache, dass meine Linie Marker in der Nähe zu einem zweiten Ansatz bewegt - es ist Dinge wie das, dass machen Computer Programmierung unendlich Spaß – Angad

3

Ich sehe, dass die Github Ausgabe sagt dies derzeit nicht unterstützt wird, aber es scheint, relativ unkompliziert, um dieses Projekt aufzuspalten und an Ihre Bedürfnisse anzupassen. Alle fnError = 's finden Sie in einer Cmd + F Suche innerhalb fileinput.js sind, wo Sie suchen müssen.

Nehmen Sie zum Beispiel hier: https://github.com/kartik-v/bootstrap-fileinput/blob/d5ed3ee989edbd5d67b8cf4bdadc9f3c18609965/js/fileinput.js#L1897

Dies ist für den Batch-Datei-Upload, die derzeit wie folgt aussieht:

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'); 
}; 

Ich versuche, diese zu modifizieren würde zu:

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? :-) 
     ); 
    } 
}; 

Hoffe das hilft!

+0

Ich löste es ein bisschen quick'n'dirtier (siehe meine Antwort unten), aber dieser Ansatz passt auch die Bedürfnisse, vielen Dank! –