Per fare in modo che sia un'operazione sincrona, è necessario avviare il nuovo trasferimento quando l'ultimo è terminato. Gmail, ad esempio, invia tutto in una volta, contemporaneamente. L'evento per lo stato di avanzamento del caricamento di file AJAX è progress
o onprogress
nell'istanza di tipo XmlHttpRequest
.
Quindi, dopo ogni $.ajax()
, sul lato server (che non so cosa si utilizzerà), inviare una risposta JSON per eseguire AJAX sull'ingresso successivo. Un'opzione sarebbe quella di associare l'elemento AJAX a ciascun elemento, per semplificare le cose, quindi è sufficiente farlo, nello success
dello $(this).sibling('input').execute_ajax()
.
Qualcosa di simile a questo:
$('input[type="file"]').on('ajax', function(){
var $this = $(this);
$.ajax({
'type':'POST',
'data': (new FormData()).append('file', this.files[0]),
'contentType': false,
'processData': false,
'xhr': function() {
var xhr = $.ajaxSettings.xhr();
if(xhr.upload){
xhr.upload.addEventListener('progress', progressbar, false);
}
return xhr;
},
'success': function(){
$this.siblings('input[type="file"]:eq(0)').trigger('ajax');
$this.remove(); // remove the field so the next call won't resend the same field
}
});
}).trigger('ajax'); // Execute only the first input[multiple] AJAX, we aren't using $.each
Il codice di cui sopra sarebbe per più <input type="file">
ma non per <input type="file" multiple>
, in questo caso, dovrebbe essere:
var count = 0;
$('input[type="file"]').on('ajax', function(){
var $this = $(this);
if (typeof this.files[count] === 'undefined') { return false; }
$.ajax({
'type':'POST',
'data': (new FormData()).append('file', this.files[count]),
'contentType': false,
'processData': false,
'xhr': function() {
var xhr = $.ajaxSettings.xhr();
if(xhr.upload){
xhr.upload.addEventListener('progress', progressbar, false);
}
return xhr;
},
'success': function(){
count++;
$this.trigger('ajax');
}
});
}).trigger('ajax'); // Execute only the first input[multiple] AJAX, we aren't using $.each
nota che questo codice è stato progettato per i browser moderni davvero che supportano formdata e XMLHttpRequest2 soltanto, nessun hack per i vecchi browser – pocesar
chiedevo perché sembra così delizioso ...;) – Selosindis
Creazione di una nuova 'forma' e l'aggiunta di file uno per uno usando '(nuovo FormData()). append ('file', this.files [count])' era quello che stavo cercando, grazie! – Mark