当前位置:   article > 正文

JS 下载文件两种方式总结_手机端 js 直接 下载 文件

手机端 js 直接 下载 文件

后端返回Blob对象(文件流),完成导出、下载功能:

1.介绍Blob

Blob

Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。

JS 下载文件

下载文件分为两种形式,哪两种方式取决于后台;

  • 如果后台服务器的静态目录有可供下载的静态资源,后台人员告知你文件路径,直接window.location.href方式获取即可;
  • 如果后台服务器无可供下载的静态资源,返回的是一个文件流(response-type: application/octet-stream;charset=UTF-8 ),则使用第二种方式(将文件写入内存,并且创建a元素,a链接href属性指向内存中的文件,download属性指向要下载的文件名,模拟a元素的点击事件,进行下载;)

1、 第一种,后台服务器有静态资源且是固定的文件名(GET方式下载文件)

window.location.href="http://www.域名/template.xlsx(文件名)"

2、第二种,后台返回文件流

解决办法一:本地可测试;推荐使用;

第一步:引入axios第三方库

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

第二步:传参、调接口,下载文件

返回数据是Blob对象

  1. axios.post(请求路径URL, {参数Params}, {
  2. responseType: 'blob'
  3. }).then(function(res){
  4. var blob = res.data;
  5. // FileReader主要用于将文件内容读入内存
  6. var reader = new FileReader();
  7. reader.readAsDataURL(blob);
  8. // onload当读取操作成功完成时调用
  9. reader.onload = function(e) {
  10. var a = document.createElement('a');
  11. // 获取文件名fileName
  12. var fileName = res.headers["content-disposition"].split("=");
  13. fileName = fileName[fileName.length - 1];
  14. fileName = fileName.replace(/"/g, "");
  15. a.download = fileName;
  16. a.href = e.target.result;
  17. document.body.appendChild(a);
  18. a.click();
  19. document.body.removeChild(a);
  20. }
  21. });

返回的数据是流文件:(流文件和Blob是不同的)

考虑到兼容IE等问题 最好采用下列的方式:

  1. let res = await proudctionApi.export_zjy(data);//获取数据
  2. let blob = this.getBlob(res.data);// 将数据转化为Blob对象
  3. let fileName = `日报${this.date}.xlsx`;// 设置文件名
  4. utils.saveAs(blob, fileName);
  5. //getBlob方法
  6. getBlob(data) {
  7. let blob = new Blob([data], {
  8. type: "application/vnd.ms-excel;charset=utf-8",
  9. });
  10. return blob;
  11. }
  12. //proudctionApi.export_zjy
  13. export function export_zjy(data) {
  14. return request({
  15. url: "/wellbore/com_daily/export_zjy",
  16. method: "post",
  17. data,
  18. responseType: 'blob' //必须设置返回数据类型 为blob
  19. });
  20. }
  21. //utils.save 方法如下:
  22. export const saveAs = (blob, filename) => {
  23. if (window.navigator.msSaveOrOpenBlob) {
  24. //IE保存Blob对象
  25. navigator.msSaveBlob(blob, filename)
  26. } else {
  27. //其他浏览器
  28. var link = document.createElement('a')
  29. var body = document.querySelector('body')
  30. /*window.URL.createObjectURL可以用于在浏览器上预览本地图片或者视频,创建一个url*/
  31. link.href = window.URL.createObjectURL(blob)//为Blob对象创建一个url地址
  32. link.download = filename
  33. /*
  34. 如果不设置download属性的话,呢么如果是jpg、txt等浏览器支持打开的属性,就会在浏览器打开该文件而不是下载下来
  35. */
  36. // fix Firefox
  37. link.style.display = 'none'
  38. body.appendChild(link)
  39. link.click()
  40. body.removeChild(link)
  41. window.URL.revokeObjectURL(link.href)// 释放地址
  42. }
  43. }

解决办法二:form表单提交,本地不可测试;不推荐使用;

  1. var exportForm = $('<form action="/api/cert/download" method="post">\
  2. <input type="hidden" name="ids" value="'+参数ids值+'"/>\
  3. </form>');
  4. $(document.body).append(exportForm);
  5. exportForm.submit();
  6. exportForm.remove();

参考地址:

https://www.cnblogs.com/zero-zm/p/12366955.html 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/63633
推荐阅读
相关标签
  

闽ICP备14008679号