js 文件下载 上传

184 阅读1分钟

下载

a

axios设置响应类型,获取blob、filename,1.创建a标签下载,销毁a标签 2.IE浏览器下载

axios({
  method:'...',
  url:'...',
  // `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json','text', 'stream'
  responseType:'blob'
}).then(res => {
    const {headers, data} = res,
    // 从响应头中获取文件名,*如果network中能看到content-disposition,代码无法获取,需后端配置
    filename = decodeURI(headers["content-disposition"].split("filename=")[1]),
    blob = new Blob([data], {type: headers["content-type"]});
    saveAs(blob, filename)
})

// 保存到本地
function saveAs(blob,filename) {
    if ('download' in document.createElement('a')) {
         const eleA = document.createElement('a');
         eleA.download = fileName
         eleA.style.display = 'none';
         eleA.href = URL.createObjectURL(blob);
         document.body.appendChild(eleA);
         eleA.click();
         URL.revokeObjectURL(eleA.href); //释放URL对象
         document.body.removeChild(eleA);
   } else {
       // IE下载
       navigator.msSaveOrOpenBlob(blob, filename)
   }
}

方法二

image.png

 $(".meeting-downloadTwo").click(function () {
          let query = {
            file_key: $(this).attr("file_key"),
            conf_key:  $(this).attr('key'),
          };
          axios({
            method: "get",
            url: "http://192.168.1.231:55553/api/1/meeting/file/down",
            params: query,
            headers: {
              "CONFERENCE-AUTH-TOKEN": sessionStorage.getItem("TOKEN"),
              "CONFERENCE-AUTH-RANDOM": sessionStorage.getItem("RANDOMTOKEN"),
              "Content-Type": "multipart/form-data",
            },
            responseType: "blob", // 转为二进制流 重点
          }).then((res) => {
            const {headers, data} = res
            let  filename = $(this).attr('file_name')
            console.log(filename,"filename");
            blob = new Blob([data], {type: headers["content-type"]});
            saveAs(blob, filename)
          });
        });
        function saveAs(blob,filename) {
          if ('download' in document.createElement('a')) {
               const eleA = document.createElement('a');
               eleA.download = filename
               eleA.style.display = 'none';
               eleA.href = URL.createObjectURL(blob);
               document.body.appendChild(eleA);
               eleA.click();
               URL.revokeObjectURL(eleA.href); //释放URL对象
               document.body.removeChild(eleA);
         } else {
             // IE下载
             navigator.msSaveOrOpenBlob(blob, filename)
         }
      }

上传

上传file文件都需要转formData

let formData = new FormData();

formData.append("file", my_file);

<input type="file" class="add-access_material" name="myfile" id='material_file' />

分段上传

$("#file").change(function () {
  let upload = function (file, skip, id) {
    let formData = new FormData(); //初始化一个FormData对象

    let blockSize = 1024 * 1024; //每块的大小

    let nextSize = Math.min((skip + 1) * blockSize, file.size); //读取到结束位置

    let fileData = file.slice(skip * blockSize, nextSize); //截取 部分文件 块

    console.log(skip * blockSize, nextSize);
    formData.append("_id", id);
    formData.append("category_id", 1);
    formData.append("filesize", file.size);
    formData.append("filename", file.name); //保存文件名字

    formData.append("file", fileData); //将 部分文件 塞入FormData

    $.ajax({
      url: BASE.base + CONFIGURL["UPLOAD"],
      type: "POST",
      headers: {
        "CONFERENCE-AUTH-TOKEN": sessionStorage.getItem("TOKEN"),
        "CONFERENCE-AUTH-RANDOM": sessionStorage.getItem("RANDOMTOKEN")
      },
      data: formData,
      processData: false,
      // 告诉jQuery不要去处理发送的数据
      contentType: false,
      // 告诉jQuery不要去设置Content-Type请求头
      success: function (responseText) {
        console.log(responseText);

        if (responseText.code == 200) {
          console.log("已经上传了" + (skip + 1) + "块文件");

          if (file.size <= nextSize) {
            //如果上传完成,则跳出继续上传
            const data = responseText.data;
            message({
              title: "上传成功"
            });
            return;
          }

          upload(file, ++skip, id);
        } else {
          message({
            title: responseText.msg,
            info: "err"
          });
        }
      }
    });
  };

  let random = function (len) {
    len = len || 32;
    let $chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678"; // 默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1

    let maxPos = $chars.length;
    let pwd = "";

    for (i = 0; i < len; i++) {
      pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
    }

    return pwd;
  };
  let file = this.files[0];
  upload(file, 0, random());
});

普通上传

$("#file").change(function () {
  let my_file = this.files[0];
  let formData = new FormData();
  formData.append("file", my_file);
  let query = {
    file: my_file
  };
  window["$http"].upload(CONFIGURL["UPLOAD"], query, gather = {
    isToken: true
  }).then(res => {
    console.log(res, "上传");
    const {
      code,
      data
    } = res.data;

    if (code === 200) {
      message({
        title: "上传成功"
      });
    } else {
      message({
        title: res.data.msg,
        info: "err"
      });
    }
  });
});