ajax文件上传进度条实现

使用ajax步骤
1.创建xhr对象
let xhr=new XMLHttpRequest();
2.绑定监听事件
xhr.onreadystatechange=function(){
if(xhr.readyState4 && xhr.status200){
//接收响应
let result=xhr.responseText;
}
}
3.打开链接,创建请求
xhr.open(method,url,true)
method 必须是字符串 ‘get’ ‘post’
url='http://127.0.0.1:3000/list
4.xhr.send()

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title></title>
    <script src="js/jquery-3.1.1.min.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
    <input type="file" id="file" />
    <!-- 进度条 -->
    <progress id="progress" value="0" max="100"></progress>
    <script type="text/javascript">
        //获取input file 的dom对象
        const inputFile=document.querySelector("#file");
        
        //监听change事件
        inputFile.addEventListener('change',function(){
            var file=inputFile.files[0]
            console.log(file)
            console.log(file.name)//文件名称
            console.log(getFileSize(file.size))//文件大小
            console.log(checkFileExt(file.name))//文件名是否合法
            //使用formData 装载file
            const formData=new FormData();
            formData.append('file',this.files[0]);
            //上传文件
            upload(formData);
        })
        
        //文件大小单位换算
        function getFileSize(fileByte) {
            var fileSizeByte = fileByte;
            var fileSizeMsg = "";
            if (fileSizeByte < 1048576) fileSizeMsg = (fileSizeByte / 1024).toFixed(2) + "KB";
            else if (fileSizeByte == 1048576) fileSizeMsg = "1MB";
            else if (fileSizeByte > 1048576 && fileSizeByte < 1073741824) fileSizeMsg = (fileSizeByte / (1024 * 1024)).toFixed(2) + "MB";
            else if (fileSizeByte > 1048576 && fileSizeByte == 1073741824) fileSizeMsg = "1GB";
            else if (fileSizeByte > 1073741824 && fileSizeByte < 1099511627776) fileSizeMsg = (fileSizeByte / (1024 * 1024 * 1024)).toFixed(2) + "GB";
            else fileSizeMsg = "文件超过1TB";
            return fileSizeMsg;
        }
        //字符)检查文件上传表单控件,如果含有[jpg,jpeg,gif,png]则显示“文件类型合法”,否则“显示文件类型错误”
        function checkFileExt(filename){
         var flag = false; //状态
         var arr = ["jpg","png","gif"];
         //取出上传文件的扩展名
         var index = filename.lastIndexOf(".");
         var ext = filename.substr(index+1);
         //循环比较
         for(var i=0;i<arr.length;i++){
              if(ext == arr[i]) {
               flag = true; //一旦找到合适的,立即退出循环
               break;
              }
         }
         //条件判断
         if(flag) {
              return true
             }else {
               return false
             }
        }
        //这里注意一下:前端监听文件进度不需要后端有什么特殊处理,后端仅仅是做了文件流的写入而已。
        //原生请求
        // const upload=(formData)=>{
        //  const xhr=new XMLHttpRequest();
        //  //监听文件上传进度
        //  xhr.upload.addEventListener('progress',function(e){
        //      if(e.lengthComputable){
        //          //获取进度
        //          const progress=Math.round((e.loaded*100)/e.total);
        //          console.log(progress) //获取进度条
        //          document.querySelector("#progress").setAttribute('value',progress);
        //      }
        //  },false);
        //  //监听上传完成事件
        //  xhr.addEventListener('load',()=>{
        //      console.log('上传完成')
        //  },false);
        //  xhr.open('post','http://127.0.0.1:3003/upload1');
        //  xhr.send(formData);
        // }
        
        //使用jquery的ajax上传
        const upload=(formData)=>{
            $.ajax({
                type:'post',
                url:'http://127.0.0.1:3003/upload1',
                data:formData,
                //不进行数据处理和内容处理
                processData:false,
                contentType:false,
                //监听 xhr 
                xhr:function(){
                    const xhr=$.ajaxSettings.xhr();
                    if(xhr.upload){
                        xhr.upload.addEventListener('progress',e=>{
                            const {loaded,total} =e;
                            
                            var progress=Math.round((loaded*100)/total);
                            console.log(progress) //获取进度条
                            document.querySelector('#progress').setAttribute('value',progress);
                        },false);
                        return xhr;
                    }   
                },
                success:function(response){
                    console.log('上传成功');
                }
            })
        }
        //使用 axios 上传并监听进度
        // const upload=async(formData)=>{
        //  let config={
        //      //注意要把 contentType 设置为multipart/form-data
        //      headers:{
        //          'Content-Type':'multipart/form-data'
        //      },
        //      //监听 onUploadProgress 事件
        //      onUploadProgress:e =>{
        //          const {loaded,total} =e;
        //          //使用本地 progress 事件
        //          if(e.lengthComputable){
        //              let progress=Math.round((loaded*100)/total);
        //              document.querySelector('#progress').setAttribute('value',progress);
        //          }
        //      }
        //  };
        //  const {status} =await axios.post('http://127.0.0.1:3003/upload1',formData,config);
        //  if(res.status===200){
        //      console.log('上传完成');
        //  }
        // }
    </script>
</body>
</html>
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光浅止

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值