当前位置:   article > 正文

axios分段下载文件_axios 下载

axios 下载

之前遇到一个文件过大下载链接断开的问题,刚开始增加超时时间,效果并不好,后来经过各方面研究,上传都可以分段上传,下载也可以,所以和后端配合,实现了分段下载功能,现在把axios如何实现分段下载逻辑,总结成方法,以便以后参考。

  1. <template></template>
  2. <script>
  3. export default {
  4. name: "download",
  5. data() {
  6. return {
  7. percentage: -1, // 下载进度
  8. };
  9. },
  10. methods: {
  11. // 分段下载需要后端配合
  12. download() {
  13. // 下载地址
  14. const url = "...";
  15. const chunkSize = 1024 * 1024 * 100; // 单个分段大小,这里测试用100M
  16. let filesTotalSize = chunkSize; // 安装包总大小,默认100M
  17. let filesPages = 1; // 总共分几段下载
  18. let filesCurrentPage = 0; // 第几段
  19. let contentList = []; // 文件流数组
  20. let sentAxios = (num) => {
  21. let rande = chunkSize;
  22. if (num) {
  23. rande = `${(num - 1) * chunkSize + 2}-${num * chunkSize + 1}`;
  24. } else {
  25. // 第一次0-1方便获取总数,计算下载进度,每段下载字节范围区间
  26. rande = "0-1";
  27. }
  28. let headers = {
  29. range: rande,
  30. };
  31. this.axios({
  32. method: "get",
  33. url: url,
  34. data: {},
  35. headers: headers,
  36. responseType: "blob",
  37. onDownloadProgress: (a) => {
  38. if (!num) {
  39. return;
  40. }
  41. var percent = parseInt(
  42. 100 * ((a.loaded + 2 + (num - 1) * chunkSize) / filesTotalSize)
  43. );
  44. this.$nextTick(() => {
  45. this.percentage = percent;
  46. if (percent == 100) {
  47. // 1秒后隐藏进度显示
  48. setTimeout(() => {
  49. this.percentage = -1;
  50. }, 1000);
  51. }
  52. });
  53. },
  54. })
  55. .then((response) => {
  56. if (response.status == 200 || response.status == 206) {
  57. //检查了下才发现,后端对文件流做了一层封装,所以将content指向response.data即可
  58. const content = response.data;
  59. // 获取文件总大小,方便计算下载百分比
  60. filesTotalSize = response.headers["content-range"].split("/")[1];
  61. // 计算总共页数,向上取整
  62. filesPages = Math.ceil(filesTotalSize / chunkSize);
  63. contentList.push(content); // 文件流数组
  64. // 递归获取文件数据
  65. if (filesCurrentPage < filesPages) {
  66. filesCurrentPage++;
  67. sentAxios(filesCurrentPage);
  68. return;
  69. }
  70. //构造一个blob对象来处理数据
  71. const reader = new FileReader();
  72. reader.readAsText(response.data);
  73. reader.onload = () => {
  74. try {
  75. // 如果返回的报文不是数据流,而是json,比如登录失效,执行下面逻辑
  76. const res = JSON.parse(reader.result);
  77. if (res.code === 401) {
  78. // ...处理逻辑
  79. }
  80. } catch (err) {
  81. const blob = new Blob(contentList);
  82. // 文件名称
  83. const fileName = response.fname;
  84. //对于<a>标签,只有 Firefox 和 Chrome(内核) 支持 download 属性
  85. //IE10以上支持blob但是依然不支持download
  86. if ("download" in document.createElement("a")) {
  87. //支持a标签download的浏览器
  88. const link = document.createElement("a"); //创建a标签
  89. link.download = fileName; //a标签添加属性
  90. link.style.display = "none";
  91. link.href = URL.createObjectURL(blob);
  92. document.body.appendChild(link);
  93. link.click(); //执行下载
  94. URL.revokeObjectURL(link.href); //释放url
  95. document.body.removeChild(link); //释放标签
  96. } else {
  97. //其他浏览器
  98. navigator.msSaveBlob(blob, fileName);
  99. }
  100. this.$message.success("下载完成!");
  101. }
  102. }
  103. } else {
  104. this.$message.error("下载失败!");
  105. }
  106. })
  107. .catch(function (error) {
  108. console.log(error);
  109. });
  110. };
  111. // 第一次获取数据方便获取总数
  112. sentAxios(filesCurrentPage);
  113. },
  114. },
  115. };
  116. </script>

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

闽ICP备14008679号