Bootstrap

前后端实现文件上传进度条-实时进度

后端接口代码:

 @PostMapping("/upload")
    public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) {
        try {
            // 获取文件名
            String fileName = file.getOriginalFilename();
            // 创建上传目标路径
            Path targetPath = Paths.get(System.getProperty("user.dir")+"/file", fileName);
            // 保存文件到本地
            Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);
            // 返回上传成功信息
            return ResponseEntity.ok().body("File uploaded successfully: " + fileName);
        } catch (IOException e) {
            e.printStackTrace();
            // 返回上传失败信息
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to upload file: " + e.getMessage());
        }
    }

前端代码:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta  http-equiv="Content-Type" charset="UTF-8">
    <title>文件上传进度条</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
    <link rel="stylesheet" href="css/sl.css">
    <style>
        body {
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: flex-start;
        }

        .uploader {
            display: flex;
            align-items: center;
        }

        .slider-track {
            width: 70vw;
            height: 8px;
            background-color: #080101;
            margin: 20px 10px 20px 0;
            border-radius: 4px;
        }

        .slider-bar {
            height: 8px;
            width: 0px;
            border-radius: inherit;
            background-image: linear-gradient(to right, #018eb2, #29c9eb);
            transition: width;
        }
    </style>
</head>
<body>

<input type="file" onchange="uploadFile(this.files)">
<div class="uploader">
    <div class="slider-track">
        <div class="slider-bar"></div>
    </div>
    <div>
        <span class="percentage">0</span>%
    </div>
</div>

</body>
</html>
<script type="text/javascript" src="js/jquery-1.8.3-source.js"></script>
<script>
    function uploadFile(files) {
        let fd = new FormData();
        //fd.append('file', files[0], "2.jpg")//设置第三个参数,就按第三个格式和名称来 不建议
        fd.append('file', files[0])//不设置第三个参数,就上传什么文件存什么文件格式
        let xhr = new XMLHttpRequest();
        let sliderBar = document.querySelector(".slider-bar")
        sliderBar.style.width = "0"
        xhr.upload.addEventListener("progress", function (e) {
            let percentage = e.loaded / e.total * 100
            sliderBar.style.width =  `${percentage}%`
            document.querySelector(".percentage").innerHTML = `${percentage.toFixed(2)}`
        })
        xhr.open('post', 'http://localhost:80/upload')
        xhr.send(fd)
    }
</script>

效果:
在这里插入图片描述
在这里插入图片描述

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;