zoukankan      html  css  js  c++  java
  • 下载文件.xlsx .csv 或者下载压缩包

    在这里我不过多介绍每行代码是什么意思。会用就行了

    vue axios 操作
    export function downLoad(data){
        return request({
            url: `/home/file/download/brand`,
            method: 'GET',
            params:data,
            responseType:'blob',
        })
    }
    derive(number){//导出W
                    let str = number==0?'.xlsx':'.csv'
                    let name = this.$route.meta.title
                    API.downLoad({type:number}).then((res)=>{
                        let url = URL.createObjectURL(new Blob([res]))
                        let link = document.createElement('a')
                        link.style.display = 'none'
                        link.href = url
                        link.setAttribute('download', name+'下载'+ str)
                        document.body.appendChild(link)
                        link.click()
           URL.revokeObjectURL()
                    })
    }
    原生方法
    fileDeal = (type: string, id: string, name: string) => {
        const client = new XMLHttpRequest();
        const _url = `${apiUrl}/oss/object/download?objectId=${id}`
        client.open("GET", _url, true)
        client.setRequestHeader('Content-Type', 'application/json');
        client.setRequestHeader("Authorization", `bearer ${sessionStorage.token}`);
        client.responseType = 'blob'
        client.send()
        client.onreadystatechange = function () {
          if (client.readyState == 4 && client.status == 200) {
            if (type === 'download') {
              // 下载
              const reader = new FileReader();
              reader.readAsDataURL(client.response);
              reader.onload = (e: any) => {
                console.log(e)
                const a = document.createElement('a');
                a.download = decodeURIComponent(name);
                a.href = e.target.result;
                a.target = "_blank"
                document.body.appendChild(a);
                a.click();
                document.body.removeChild(a);
              };
            } else {
              // 预览
              let blob = new Blob([client.response], {
                type: 'application/pdf;chartset=UTF-8'
              });
              let fileURL = URL.createObjectURL(blob);
              window.open(fileURL);
            }
          }
        }
      }
    原生下载压缩包
    import {saveAs} from "file-saver";  这是一个插件里面做的事无非就事创建a标签,然后点击最后删掉a标签
       const apiUrl = `${ENV.APIROOT}/${ENV.APIVERSION}`;   
            const client = new XMLHttpRequest();
            const _url = apiUrl+`/downloadCompress/${id}`
            client.open("GET", _url, true)
            client.setRequestHeader('Content-Type', 'application/json');
            client.setRequestHeader("Authorization", `bearer ${sessionStorage.token}`);
            client.responseType = 'blob'
            client.send()
            client.onreadystatechange = function () {
                if (client.readyState == 4 && client.status == 200) {
                    console.log(client)
                    let fileName:any = decodeURIComponent(client.getResponseHeader('Content-disposition') || '').split('filename=')[ 1 ]
                    saveAs(client.response, fileName);
                }
       if (client.readyState === 4 && client.status === 200) {
            let name: any = exportName ? `${exportName}.xlsx` : "导出.xlsx";
            const headerName = client.getResponseHeader("Content-disposition");
            console.log("headerName", headerName, client.response);
            if (headerName) {
              const nameIndex = headerName.lastIndexOf("=");
              name = nameIndex !== -1 && headerName.substring(nameIndex + 1);
            }
            window.saveAs(client.response, decodeURIComponent(name));
          }
    }
    其实这里我有不同的观点,其实有简便的方法,我们普通的下载也可以用saveAs(client.response,fileName)
    这个插件就是file-saver  
    https://github.com/eligrey/FileSaver.js/blob/master/src/FileSaver.js   源码基于base64
    vue  axios下载压缩包
    API.exportGoodsPosition(param).then((res)=>{
                let str = res.headers['content-disposition']
                let name = str.split('=')[1]
                let url = window.URL.createObjectURL(new Blob([res.data]))
                let link = document.createElement('a')
                link.style.display = 'none'
                link.href = url
                link.setAttribute('download', decodeURIComponent(name))
                document.body.appendChild(link)
                link.click()
        URL.revokeObjectURL(url)
        document.body.removeChild(link);
     })
     此外还有很多可以复用的ts写法,即使写法有很多但是都大同小异。如下
    exportStream(url, params)
        .then((res: any) => {
          that.setState({ [`${loadingFiled}`]: false });
          let bolb: Blob = new Blob([res]);
          let a: HTMLAnchorElement = document.createElement("a");
          let url: string = window.URL.createObjectURL(bolb);
          a.setAttribute("href", url);
          a.setAttribute("download", `${name}.xlsx`);
          a.click();
          URL.revokeObjectURL(url);
        })
    此外还给大家普及下 XMLHttpRequest上面的方法   abort  getAllResponseHeaders  getResponseHeader  open  send   setRequestHeader overRideMimeType  upload
  • 相关阅读:
    windows环境下pycharm如何设置Linux编码
    centos安装Nginx1.9.9
    http无状态协议,cookie和session详解(一)
    windows7安装flaskmysqldb遇到的坑
    python文件处理b模式
    windows7安装MySQLpython遇到的坑
    flask数据库迁移理解及命令
    Python循环文件推荐的方式,可用于读取文本最后一行或删除指定行等
    XMLHttpRequest
    Javascript鼠标事件
  • 原文地址:https://www.cnblogs.com/MDGE/p/13913195.html
Copyright © 2011-2022 走看看