前端下载文化部几种方法(excel,zip,html,markdown、图片等等)和导出 zip 压缩包

文章目录


1、location.href

js 复制代码
//get请求
window.location.href = url;

2、location.href

js 复制代码
//get请求和location.href类似
window.open(url);

3、a标签

js 复制代码
//写法1
const download = (filename, url) => {
    let a = document.createElement('a'); 
    a.style = 'display: none'; // 创建一个隐藏的a标签
    a.download = filename;
    a.href = url;
    document.body.appendChild(a);
    a.click(); // 触发a标签的click事件
    document.body.removeChild(a);
}

4、请求后端的方式

js 复制代码
axios({
  method: 'post',
  headers: {
    'Content-Type': 'application/json; charset=utf-8'
  },
  url: '/robot/strategyManagement/analysisExcel',
  responseType: 'blob',
  headers: { //如果需要权限下载的话,加在这里
        Authorization: '123456'
    }
  data: JSON.stringify(params),
}).then(function(res){
   var content = res.headers['content-disposition'];
   var name = content && content.split(';')[1].split('filename=')[1];
   var fileName = decodeURIComponent(name)
   downloadFile(res.data,fileName)
})

5、文件下载的方式

js 复制代码
downloadFile:function(data,fileName){
    // data为blob格式
    var blob = new Blob([data]);
    var downloadElement = document.createElement('a');
    var href = window.URL.createObjectURL(blob);
    downloadElement.href = href;
    downloadElement.download = fileName;
    document.body.appendChild(downloadElement);
    downloadElement.click();
    document.body.removeChild(downloadElement);
    window.URL.revokeObjectURL(href);
}

6、Blob和Base64

js 复制代码
function downloadFile(res, Filename) {
  // res为接口返回数据,在请求接口的时候可进行鉴权
  if (!res) return;
  // IE及IE内核浏览器
  if ("msSaveOrOpenBlob" in navigator) {
    navigator.msSaveOrOpenBlob(res, name);
    return;
  }
  const url = URL.createObjectURL(new Blob([res]));
  //  const fileReader = new FileReader();  使用 Base64 编码生成
  // fileReader.readAsDataURL(res);
  // fileReader.onload = function() { ...此处逻辑和下面创建a标签并释放代码一致,可从fileReader.result获取href值... }
  const a = document.createElement("a");
  a.style.display = "none";
  a.href = url;
  a.download = Filename;
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
  URL.revokeObjectURL(url); // 释放blob对象
}

7、下载附件方法(excel,zip,html,markdown)

js 复制代码
/**
 * @param data 数据
 * @param fileName 文件名称
 * @param type 导出文件类型
 */
export const download = (data: Blob, fileName: string, type: string) => {
  // 创建 blob
  const blob = new Blob([data], { type: mineType[type] })
  // 创建 href 超链接,点击进行下载
  window.URL = window.URL || window.webkitURL
  const href = URL.createObjectURL(blob)
  const downA = document.createElement('a')
  downA.href = href
  downA.download = fileName
  downA.click()
  // 销毁超连接
  window.URL.revokeObjectURL(href)
}

export const mineType = {
  excel: 'application/vnd.ms-excel', // 下载 Excel
  word: 'application/msword', // 下载 Word
  zip: 'application/zip', // 下载 Zip
  html: 'text/html', // 下载 Html
  markdown: 'text/markdown', // 下载 Markdown
}

使用

js 复制代码
download(res, '导出模板.docx', 'word')

8、封装下载函数

js 复制代码
export const download = (res, type, filename) => {
  // 创建blob对象,解析流数据
  const blob = new Blob([res], {
    // 设置返回的文件类型
    // type: 'application/pdf;charset=UTF-8' 表示下载文档为pdf,如果是word则设置为msword,excel为excel
    type: type
  })
  // 这里就是创建一个a标签,等下用来模拟点击事件
  const a = document.createElement('a')
  // 兼容webkix浏览器,处理webkit浏览器中href自动添加blob前缀,默认在浏览器打开而不是下载
  const URL = window.URL || window.webkitURL
  // 根据解析后的blob对象创建URL 对象
  const herf = URL.createObjectURL(blob)
  // 下载链接
  a.href = herf
  // 下载文件名,如果后端没有返回,可以自己写a.download = '文件.pdf'
  a.download = filename
  document.body.appendChild(a)
  // 点击a标签,进行下载 
  a.click()
  // 收尾工作,在内存中移除URL 对象
  document.body.removeChild(a)
  window.URL.revokeObjectURL(herf)
}

9、导出 zip 压缩包相关方法(流方式)

后端的设置 Content-Type: application/octet-stream(下载用的流)

js 复制代码
 // 下载zip方法
    //zip格式文件下载
    zipdwonUpload(data) {
      console.log("干部任免表传递的数据", data);
      let ids = data.ids;
      console.log("ids集合数据", ids);
      // 导出干部任免表接口
      this.$axios
        .post(`personnel/exportAppointmentAndDismissal`, ids, {
          responseType: "blob",
        })
        .then((res) => {
          // res
          let blob = res;
          let that = this;
          //通过FileReader读取数据,是一种异步文件读取机制
          let reader = new FileReader();
          //以下这两种方式我都可以解析出来,因为Blob对象的数据可以按文本或二进制的格式进行读取
          // reader.readAsBinaryString(blob, 'utf8');
          reader.readAsText(blob, "utf8");
          // eadAsText(file, encoding);以纯文本的方式读取,读取到的文本保存在result属性中。第二个参数代表编码格式

          reader.onload = function (result) {
            //onload在成功加载后就会触发
            console.log("result信息", result);
            console.log(
              "isJson判断是否为json格式",
              that.isJSON(result.target.result)
            );
            if (that.isJSON(result.target.result)) {
              that.$message.warning(JSON.parse(result.target.result).msg);
              // loading效果
              // that.loadingBut = false;
            } else {
              console.log("下载zip数据", res);
              // that.downloadFile(res);
            }
          };
        })
        .catch((error) => {
          console.log(error);
          // 打印错误
        })
        .finally(() => {
          // 导出按钮loading效果
          this.isDownloadingFile = false;
        });
    },

使用导出 zip

js 复制代码
    // 导出zip
    downloadFile(res) {
      // res 下载转blob二进制或文本数据
      let blob = new Blob([res], { type: "application/zip" });
      console.log("导出的blob", blob);
      if (window.navigator.msSaveOrOpenBlob) {
        // msSaveOrOpenBlob 提供保存和打开按钮
        navigator.msSaveOrOpenBlob(blob, "xxx.zip");
        // navigator.msSaveOrOpenBlob(blob, "xxx.zip");
        return;
      }
      let url = window.URL.createObjectURL(blob);
      const link = document.createElement("a"); // 创建a标签
      link.href = url;
      link.download = `干部任免压缩包`; // 重命名文件
      link.click();
      URL.revokeObjectURL(url); // 释放内存
      // this.loadingBut = false; //loading效果
    },

总结

如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对前端或者对python感兴趣的朋友,请多多关注💖💖💖,咱们一起探讨和努力!!!

👨‍🔧 个人主页 : 前端初见

相关推荐
y先森24 分钟前
CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow
前端·css·css3
前端Hardy24 分钟前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu108301891127 分钟前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
IT女孩儿2 小时前
CSS查缺补漏(补充上一条)
前端·css
吃杠碰小鸡2 小时前
commitlint校验git提交信息
前端
emmm4593 小时前
html兼容性问题处理
html
虾球xz3 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇3 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒3 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员3 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js