vue中各种文档的下载/导出

1,293 阅读1分钟

1.下载本地的文件 1.在vue-cli 3.x+中,直接将文件放在public下面

window.location.href="/file/xxx.doc"

这种写法本地不会有问题,但是线上部署出现了问题,显示文件找不到;所以改为

window.location.href=`${process.env.BASE_URL}file/beian_import.xls`

当前也可以不用window.location.href来下载,可以使用dom动态生成a标签来下载;

downExcel(){
      var link = document.createElement("a"); 
      link.setAttribute("download", "");
      link.href = `${process.env.BASE_URL}file/beian_import.xls`;
      link.click();
      link.remove();
    },

2.在vue-cli 2.x+中将文件放置在static文件夹下面

 window.location.href="http://localhost:8080/static/template.xlsx" ;

2.下载后台返回数据成功的json文件

downJson(data,file_name){
           exportRecordDown(data).then(res=>{
           var data = JSON.stringify(res.data) 
          //encodeURIComponent解决中文乱码  data:text/csv;charset=utf-8,\uFEFF(加    \uFEFF是实现bob)
          let uri ='data:text/csv;charset=utf-8,' +encodeURIComponent(data);
          //通过创建a标签实现
          let link = document.createElement("a");
          link.href = uri;
          //对下载的文件命名
          link.download =  file_name;
          document.body.appendChild(link);
          link.click();
          document.body.removeChild(link);
       })
    },

3.下载csv文件

handleExport(){
			if(!this.tableData || this.tableData.length <=0 ){
				this.$message.error('没有要导出的数据')
				return
      }
			let csvContent = this.headerLabel + '\n\t'
			this.tableData.forEach((item, index) => {
				let dataString = ''
				for(let i = 0; i < this.headerProp.length; i++ ){
				//如果数据为null或者undefined, 下载下来的数据框中会被直接填写上null或undefined
				//可根据个人选择自行选择是否需要这行代码
					if(item[this.headerProp[i]]==null||item[this.headerProp[i]]==undefined){
						item[this.headerProp[i]] = ''
					}
					dataString += item[this.headerProp[i]] + ','
				}
				csvContent += (index < this.tableData.length ? dataString.replace('/,$/', '\n\t') : dataString.replace('/,$/', '\n\t'))+'\n\t'
      })
      console.log(csvContent)
			//最终csvContent的格式为"col1,col2,col3 \n value1, value2, value3 \n value4, value5, value6"
			//data:text/csv;charset=utf-8,\ufeff, utf-8的编码格式,保证中文不乱码
			// this.$refs.link.setAttribute('href', 'data:text/csv;charset=utf-8,\ufeff'+encodeURIComponent(csvContent))
      // this.$refs.link.setAttribute('download', this.fileName+'.csv')
        var url='data:text/csv;charset=utf-8,\ufeff'+encodeURIComponent(csvContent);
        let link = document.createElement('a')
        link.style.display = 'none'
        link.href = url
        link.setAttribute('download',  '僵尸网站数据表'+'.csv')
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link) // 下载完成移除元素
        window.URL.revokeObjectURL(url) // 释放掉blob对象
    },
    //数据遍历筛选
      computed: {
      headerLabel(){
        var result=[];
        this.checkListShow.forEach(item=>{
          result.push(item.name)
        })
        return result
      },
      headerProp(){
        var result=[];
        this.checkListShow.forEach(item=>{
          result.push(item.prop)   
        })
        return result
      }
	 },

3.下载后台返回文件流数据

image.png

 exportBillingExcel(data, res){
      if (!data) {//如果没有data数据就不进行操作
         return
       }
      // 获取headers中的filename文件名
      let tempName = res.headers['content-disposition'].split(';')[1].split('filename=')[1]
      // iconv-lite解决中文乱码
      let iconv = require('iconv-lite')
      iconv.skipDecodeWarning = true// 忽略警告
      let fileName = iconv.decode(tempName, 'gbk')
      let blob = new Blob([data], { type: 'application/octet-stream' })//转换成二进制对象
      if ('download' in document.createElement('a')) { // 不是IE浏览器
        let url = window.URL.createObjectURL(blob)//二进制对象转换成url地址
        let link = document.createElement('a')
        link.style.display = 'none'
        link.href = url
        link.setAttribute('download', fileName)
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link) // 下载完成移除元素
        window.URL.revokeObjectURL(url) // 释放掉blob对象
      } else {
        window.navigator.msSaveBlob(blob, fileName)
      }
    },

4.下载后台返回数据的.log后缀、.pem后缀文件

  downFile(data,name){
                let blob = new Blob([data], {type: "application/octet-stream"});     //下载文件的通用格式
                    console.log(window.navigator.msSaveBlob)
                    if (window.navigator.msSaveBlob) {
                        window.navigator.msSaveBlob(blob, name+ '.' + 'log');//处理IE下载的兼容性
                    } else {
                        let downloadElement = document.createElement('a');
                        let href = window.URL.createObjectURL(blob); //创建下载的链接
                    downloadElement.href = href;
                        downloadElement.download =  name+ '.' + 'log' ; //下载后文件名
                        document.body.appendChild(downloadElement);
                        downloadElement.click(); //点击下载
                        document.body.removeChild(downloadElement); //下载完成移除元素
                        window.URL.revokeObjectURL(href); //释放掉blob对象
                }
            }

5.下载图片

var link = document.createElement("a"); 
link.setAttribute("download", "");
link.href ="图片地址路径";
link.click();

6.下载二进制流文件

exporBeianPdf('', { responseType: 'blob' })
        .then(res => {
          this.downBinary(res);
        })
        .catch(() => {
          this.$message.error('导出失败,请重试。');
        });
// 下载二进制文件
    downBinary(res) {
      const data = res.data;
      const tempName = res.headers['content-disposition']
        .split(';')[1]
        .split('filename=')[1];
      /* 兼容ie内核,360浏览器的兼容模式 */
      if (window.navigator && window.navigator.msSaveOrOpenBlob) {
        const blob = new Blob([data]);
        window.navigator.msSaveOrOpenBlob(blob, tempName);
      } else {
        /* 火狐谷歌的文件下载方式 */
        var blob = new Blob([data]);
        var downloadElement = document.createElement('a');
        var href = window.URL.createObjectURL(blob);
        downloadElement.href = href;
        downloadElement.download = tempName;
        document.body.appendChild(downloadElement);
        downloadElement.click();
        document.body.removeChild(downloadElement);
        window.URL.revokeObjectURL(href);
      }
    },

7.base64文件下载,图片和文件都适用

dwonImageBase64(name,data){
      //let imgData = "data:image/jpg;base64," + ret;  
     //data是带有"data:image/jpg;base64,"的内容的值
       this.downloadFile(name, data);
    },
    downloadFile(fileName, content) {
        let aLink = document.createElement('a');
        let blob = this.base64ToBlob(content); //new Blob([content]);

        let evt = document.createEvent("HTMLEvents");
        evt.initEvent("click", true, true);//initEvent 不加后两个参数在FF下会报错  事件类型,是否冒泡,是否阻止浏览器的默认行为
        aLink.download = fileName;
        aLink.href = URL.createObjectURL(blob);
        // aLink.dispatchEvent(evt);
        aLink.click()
   },
    base64ToBlob(code) {
        let parts = code.split(';base64,');
        let contentType = parts[0].split(':')[1];
        let raw = window.atob(parts[1]);
        let rawLength = raw.length;

        let uInt8Array = new Uint8Array(rawLength);

        for (let i = 0; i < rawLength; ++i) {
          uInt8Array[i] = raw.charCodeAt(i);
        }
        return new Blob([uInt8Array], {type: contentType});
    },

8.前端实现批量下载文件

    function downloadFile(url) {

    var iframe = document.createElement('iframe')

    iframe.style.display = 'none' // 防止影响页面

    iframe.style.height = 0 // 防止影响页面

    iframe.src = url

    document.body.appendChild(iframe) // 这一行必须,iframe挂在到dom树上才会发请求

    console.log(iframe)

    // 5分钟之后删除(onload方法对于下载链接不起作用,就先抠脚一下吧)

    setTimeout(() => {

    iframe.remove()

    }, 5000)

    }