文件上传进度显示

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