<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="file" class="myfile">
    进度: <progress value="0" max="100"></progress>
          <span class="per">0%</span>
    速度: <span class="speed">0b/s</span>
    <button>点击上传</button>
    <button>点击取消</button>

    <script>
        let xhr = new XMLHttpRequest();
        
        let stime;//储存时间
        let sloaded; //储存上传的内容

        let but = document.querySelectorAll("button");
        but[0].onclick =function(){
            let file = document.querySelector(".myfile").files[0]
            let form = new FormData();
            form.append("myfile",file);

            xhr.open("post","/fileUpload")
            xhr.onload = function(){
                console.log(xhr.responseText)
            }
            xhr.upload.onloadstart = function(){
                console.log("开始上传")
                stime = new Date().getTime(); //开始的时间
                sloaded = 0;                  //开始的内容
            }
            xhr.upload.onprogress = function(evt){
                console.log("上传中")
                // 当前文件上传的大小 evt.loaded
                // 需要传输的总大小 evt.total   toFixed()去掉小数点  括号写几就剩余几位小数点
                let percent = ((evt.loaded/evt.total) * 100).toFixed()
                document.querySelector("progress").value = percent;
                // 百分比形式显示进度
                document.querySelector(".per").innerHTML = percent+"%"
                
                // 每段的终点
                let endTime = new Date().getTime();
                // 1时间差 = 结束时间 - 开始时间
                let dTime = (endTime - stime)
                // console.log(endTime)

                // 2.当前时间段内上传的文件大小 = 当前上传大小 - 之前上传的内容
                let dloaded = evt.loaded - sloaded;
                // evt.loaded=1 sloaded=0 
                // evt.loaded=2 sloaded=1   
                // evt.loaded=3 sloaded=2  
                
                // 3.当前速度 = 当前时间段内上传的文件大小 / 时间差
                let speed = dloaded / dTime
   
                stime = new Date().getTime();  //重置当前时间 当一段结束时开始时间就变了
                sloaded = evt.loaded;          //重置储存上传内容

                // 单位
                let unit = "b/s";
                if(speed/1024 > 1){
                    unit = "kb/s";
                    speed = speed / 1024
                }
                if(speed/1024 > 1){
                    unit = "mb/s";
                    speed = speed / 1024
                }
                // 显示到页面                                  保留两位小数   拼接单位
                document.querySelector(".speed").innerHTML = speed.toFixed(3)+unit;
                
            }
            xhr.upload.onload = function(){
                console.log("上传成功")
            }
            xhr.upload.onerror = function(){
                console.log("上传失败")
            }
            xhr.upload.onloadend = function(){
                console.log("上传完成")
            }
            
            xhr.send(form)
        }
            but[1].onclick = function(){
                xhr.abort()  // 取消上传 写到点点击but[0]外面
            }
    </script>

</body>
</html>
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐