Jeg jobbet på i flere timer for å finne ut hvordan man kan bruke jQuery sitt $.ajax()-kall til å sende filer ved hjelp av nyere HTML5-«standarder», som for eksempel drag/drop-eventene og File-, FileReader- og FormData-klassene.
Det kan godt hende det bare er meg, men jeg slet hardt og godt med å finne ut hvordan jeg kunne bruke jQuery sitt $.ajax()-kall for å sende filer, da ved hjelp av siste nytt i HTML5, nemlig drag/drop-eventene og File/FileReader/FormData-klassene.
Kort fortalt: $.ajax() må settes til å ikke prosessere dataene, ei heller sette content-type i HTTP-forespørselen.
$.ajax({
'url': 'upload.php',
'type': 'post',
'data': ,
'processData': false,
'contentType': false,
'success': function(data) {
// do stuff
}
});
I tillegg vil man ofte legge til et opplastingsbarometer eller lignende, noe som krever at man fester en metode til «onprogress»-eventen til XMLHttpRequest-objektet. Med jQuery er ikke det bare-bare, men $.ajax() har en mulighet for å overstyre dets xhr-objekt. For eksempel:
$.ajax({
'url': 'upload.php',
'type': 'post',
'data': fd,
'processData': false,
'contentType': false,
'xhr': function(e) {
var xhr = $.ajaxSettings.xhr();
xhr.upload.addEventListener('progress', this.progress);
return xhr;
},
'progress': function(e) {
// upload bar stuff here
},
'success': function(data) {
// success code!
}
});
I akkurat det eksempelet, setter den this.progress som callback, noe som gjør at vi kan sette «progress» i selve config-objektet til $.ajax(). Du kan likegodt ha en lambda-funksjon der. Eventuelt kan du sette opp slik at alle $.ajax()-kall vil ha støtte for progress ved å bruke $.ajaxSetup().