8

Quando carico un file con Krajees Bootstrap Fileinput, eseguo una convalida sul lato server del file. Quando qualcosa va storto, emetto un oggetto JSON semplicemente con {error:'Something went wrong'}. Il plugin visualizza perfettamente l'errore.Bootstrap Fileinput non invia nuovamente il file al secondo caricamento

Ma poi: quando premo di nuovo "carica" ​​subito dopo, l'array $_FILES nello script PHP di invio chiamato è vuoto. Ciò significa che il plug-in non invia di nuovo il file anche se ha segnalato che si è verificato un errore.

Perché il plug-in caricare il file solo una volta, anche se rileva che si è verificato un errore? Esistono metodi che possono "resettare" lo "stato caricato" del file? (Sto solo caricando un file).

Ho già controllato il file events ma nessuno di questi mi ha portato al risultato desiderato, invece hanno distrutto l'intero modulo di caricamento con alcuni pulsanti improvvisamente disabilitati e così via.

+0

Puoi fornire demo in plunkr perché il sito plug-in non è disponibile al momento –

+0

@PareshGami Non riesco a creare uno snippet adesso, ma in fondo è esattamente quello che dovrebbe fare. Tuttavia, ho anche chiesto a Kartik e lui ha risposto che questo non è attualmente possibile: https://github.com/kartik-v/bootstrap-fileinput/issues/637 –

+1

@ FlorianMüller è ancora irrisolto per te? Immagino che https://github.com/kartik-v/bootstrap-fileinput/blob/master/js/fileinput.js#L1534 sia dove dovresti essere in grado di scrivere la tua retry-logic abbastanza facilmente :-) – Angad

risposta

2

fine ho scoperto il punto esatto in cui il problema potrebbe essere risolto:

Sulla line 1705 in the function updateUploadLog, la funzione self.updateStack è chiamato. Questa chiamata cancella semplicemente lo stack di file e fa in modo che un processo successivo svuoti l'input del modulo. Semplicemente commentando questa linea fa il trucco, ma solo se si ricarica dopo il successo, perché in qualche modo viene chiamato anche fnSuccess quando viene rilevato un errore.

@Angad vi ringrazio molto per la vostra soluzione innescare ingresso, grazie a questo ho trovato un posto per iniziare di nuovo la ricerca;)

+2

+1 Non riesco ancora a superare il fatto che il mio indicatore di linea si è avvicinato ad un secondo approccio - è così che rendere la programmazione del computer infinitamente divertente – Angad

3

vedo che la questione Github dice che questo non è attualmente supportato, ma sembra relativamente semplice da forgiare questo progetto e piegarlo alle tue esigenze. Tutti gli fnError = che troverai in una ricerca Cmd + F all'interno di fileinput.js sono dove devi cercare.

Prendete per esempio qui: https://github.com/kartik-v/bootstrap-fileinput/blob/d5ed3ee989edbd5d67b8cf4bdadc9f3c18609965/js/fileinput.js#L1897

Questo è per il batch di caricamento file che attualmente appare così:

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

mi piacerebbe provare modificando questo:

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

Spero che questo ti aiuti!

+0

L'ho risolto un po 'più veloce (vedi la mia risposta qui sotto), ma questo approccio si adatta anche alle esigenze, grazie mille! –