ajax上传文件,使用formData与fileReader

<form action="" enctype="multipart/form-data">
    <input type="file" id="file" onchange="addFile()">
</form>

添加multiple属性,就可上传多个文件

function addFile(){
  let fileObj = document.getElementById("file").files[0];
  let formData = new FormData();
  formData.append("file", fileObj);
  let request = new XMLHttpRequest();
  request.open("POST", /upload);
  request.onloadstart = function () {   //上传前执行
      console.log('我要开始上传了')  
  }
  request.onabort = function () {      //上传中断执行
       alert("文件上传中断,请重试")
  };
  request.onprogress = function (event) {  // 会在上传完成前周期执行,可以用来做进度条
       console.log((event.loaded / event.total) * 100)        
  };  
  request.onerror = function () {      //上传错误执行
       alert("文件上传出错,请重试")
  };
  request.onload = function () {        //上传成功执行
       alert("上传完成!");
  };
  request.send(formData);
},

console.log(formData.get('file'));  //可以查看文件所包含属性

     以音乐MP3音乐文件为例

也可以使用fileReader读取图片文件然后上传图片

 function addFile() {
        let imgcode = document.getElementById("file").files[0];
        var reader = new FileReader();
        let request = new XMLHttpRequest();
        reader.readAsDataURL(imgcode);      //将二进制文件转化为Base64格式
        reader.onload = e => {
            request.open("POST", "/upload");
            request.onload = function () {
                alert("上传完成!");
            }; 
            request.send(e.target.result);
        }
    }

图片文件会被编码为base64格式

如果文件很大,需要分段上传,可以采用blob分割大文件上传,当然也需服务端配合

  let fileReader = new FileReader();
  let file = document.getElementById("file").files[0];
  let request = new XMLHttpRequest();
  const ONE_MB = 1024 * 1024;
  let sendedBytes = 0;
  fileReader.onload = function() {
    request.open();
    request.send(this.result);
    sendedBytes += ONE_MB;
    if(sendedBytes < file.size) {
      let blob = file.slice(sendedBytes, sendedBytes + ONE_MB);
      fileReader.readAsArrayBuffer(blob);
    }
  }
  let blob = file.slice(0, ONE_MB);
  fileReader.readAsArrayBuffer(blob);

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值