要使用$.ajax上傳文件并獲取進(jìn)度,我們首先需要將文件轉(zhuǎn)換為FormData對(duì)象。FormData是HTML5中用于上傳文件和表單數(shù)據(jù)的對(duì)象。這個(gè)對(duì)象可以在不刷新頁(yè)面的情況下,向服務(wù)器發(fā)送文件和表單數(shù)據(jù)。
以下是一個(gè)實(shí)例,展示了如何通過(guò)$.ajax上傳文件,并實(shí)時(shí)獲取文件上傳的進(jìn)度:
$('input[type=file]').change(function() {
var file = this.files[0];
var formData = new FormData();
formData.append('file', file);
$.ajax({
url: '/upload',
type: 'POST',
data: formData,
processData: false,
contentType: false,
xhr: function() {
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', function(event) {
if (event.lengthComputable) {
var percent = Math.round((event.loaded / event.total) * 100);
console.log('上傳進(jìn)度: ' + percent + '%');
}
}, false);
return xhr;
}
})
.done(function(data) {
console.log('文件上傳成功');
console.log(data);
})
.fail(function() {
console.log('文件上傳失敗');
});
});
在上面的代碼中,我們首先監(jiān)聽了文件選擇框的change事件。當(dāng)用戶選擇了文件后,我們通過(guò)FormData對(duì)象將文件添加到表單數(shù)據(jù)中。然后,通過(guò)$.ajax方法將文件數(shù)據(jù)發(fā)送到服務(wù)器的/upload路由。注意,我們需要將processData和contentType選項(xiàng)設(shè)置為false,以避免$.ajax對(duì)FormData進(jìn)行默認(rèn)處理。
通過(guò)設(shè)置xhr選項(xiàng)的函數(shù),我們可以獲取返回一個(gè)XMLHttpRequest對(duì)象。在這個(gè)函數(shù)中,我們添加了一個(gè)progress事件監(jiān)聽器,用于實(shí)時(shí)獲取文件上傳的進(jìn)度。在事件監(jiān)聽器中,我們通過(guò)event.loaded和event.total屬性計(jì)算出文件上傳的完成百分比,并使用console.log打印出來(lái)。
當(dāng)文件上傳完成后,我們可以通過(guò)done方法獲取服務(wù)器返回的數(shù)據(jù),并使用console.log打印出來(lái)。如果文件上傳失敗,則調(diào)用fail方法進(jìn)行錯(cuò)誤處理。
通過(guò)上述代碼,我們可以實(shí)時(shí)地獲取文件上傳的進(jìn)度。這在一些需要上傳大文件或者上傳比較耗時(shí)的情況下非常有用。例如,當(dāng)我們上傳視頻文件時(shí),可以通過(guò)實(shí)時(shí)獲取進(jìn)度,顯示一個(gè)進(jìn)度條,以告知用戶文件上傳的進(jìn)程,并給予用戶正確的反饋。
綜上所述,通過(guò)使用$.ajax方法,我們可以方便地上傳文件并獲取上傳進(jìn)度。這讓我們可以更好地控制文件上傳,提升用戶體驗(yàn),實(shí)現(xiàn)更加交互式的上傳操作。