文件上传进度显示
wenking 9/20/2023 通用组件
前端发送http请求,主要有fetch和XMLHttpRequest两种方式,fetch属于较新的api,可以进行流式请求,但是对于请求进度监控不是很友好,通常选用xhr。
# 代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1></h1>
<input id="file" type="file" multiple/>
<button id="abort" >终止上传</button>
</body>
<script>
const file = document.querySelector("#file");
const xhr = new XMLHttpRequest();
// 监听文件上传事件
file.addEventListener("change", function (e) {
xhr.open("POST", "http://localhost:8080/file/upload")
xhr.responseType = 'json'
let files = e.target.files;
// 表单上传文件
let formData = new FormData();
for (let i = 0; i < files.length; i++) {
formData.append("files", files[i]);
}
const h1 = document.querySelector("h1");
// 监听上传进度事件
xhr.upload.onprogress = function (e) {
h1.innerText = `上传进度: ${e.loaded / e.total * 100} %`;
}
// 监听上传请求完成事件
xhr.upload.addEventListener("load", function (e) {
console.log("上传数据完成")
})
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
console.log(xhr.response)
}
}
// 监听请求终止事件
xhr.addEventListener("abort", function () {
h1.innerText = "上传已终止!";
})
xhr.send(formData)
})
// 触发请求终止事件
document.querySelector("#abort").addEventListener("click", function () {
xhr.abort();
})
</script>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62