在JavaScript中实现文件上传进度显示,通常涉及到HTML5的XMLHttpRequest
对象或者使用Fetch API
结合ReadableStream
来监控上传进度。以下是相关的基础概念、优势、类型、应用场景以及如何实现上传进度的详细解释:
上传进度:指文件从客户端传输到服务器的过程中,已传输的数据量占总数据量的比例。
XMLHttpRequest
的上传进度:通过监听XMLHttpRequest
对象的progress
事件来实现。Fetch API
的上传进度:通过读取响应体的ReadableStream
来实现。XMLHttpRequest
的上传进度function uploadFile(file) {
const xhr = new XMLHttpRequest();
const formData = new FormData();
formData.append('file', file);
xhr.open('POST', '/upload', true);
xhr.upload.addEventListener('progress', function(event) {
if (event.lengthComputable) {
const percentComplete = (event.loaded / event.total) * 100;
console.log(`上传进度: ${percentComplete.toFixed(2)}%`);
}
});
xhr.onload = function() {
if (xhr.status === 200) {
console.log('上传成功');
} else {
console.log('上传失败');
}
};
xhr.send(formData);
}
Fetch API
的上传进度async function uploadFileWithFetch(file) {
const url = '/upload';
const response = await fetch(url, {
method: 'POST',
body: file,
headers: {
'Content-Type': file.type
}
});
if (!response.ok) {
throw new Error('上传失败');
}
const reader = response.body.getReader();
const contentLength = +response.headers.get('Content-Length');
let receivedLength = 0;
while (true) {
const { done, value } = await reader.read();
if (done) break;
receivedLength += value.length;
const percentComplete = (receivedLength / contentLength) * 100;
console.log(`上传进度: ${percentComplete.toFixed(2)}%`);
}
console.log('上传成功');
}
progress
事件不触发:XMLHttpRequest
对象的open
方法中第三个参数设置为true
(异步请求)。event.lengthComputable
为true
,即服务器返回了Content-Length
头。Fetch API
的进度监控在较新的浏览器中支持较好,对于旧版浏览器可以使用XMLHttpRequest
。通过以上方法,可以在JavaScript中实现文件上传进度的监控,提升用户体验和开发效率。
领取专属 10元无门槛券
手把手带您无忧上云