故事的开始

老板说:系统很慢,下载半个小时无法下载,是否考虑先压缩再给用户下载?

  本来是已经压缩过了,不过第一反应应该是用户下的数量多,导致压缩包很大,然后自己测试发现,只是等待的时间比较久而已,仍然是下载状态中,并不是系统慢,但是用户体验肯定是最直观的,确实是我们做得不够好,单纯弹出遮罩层显示冰冷的“拼命加载中……”,对用户来说确实不够友好。嗯,了解实际情况了,那就开撸,增加用户体验。

解决它

效果图:

Vue+ElementUI

  1. <el-progress v-if="dlProgress>0" :text-inside="true" :stroke-width="18" :percentage="dlProgress" status="success" style="margin-bottom:10px"></el-progress>

Axios

  1. downloadTask(index,row) {
  2. let own =this;
  3. this.fullscreenLoading = true;
  4. this.axios({
  5. method: 'post',
  6. url: this.baseUrl + '/api/Task/DownLoad',
  7. data: {id: row.id},
  8. responseType: 'blob',
  9. onDownloadProgress (progress) {
  10. own.dlProgress=Math.round(progress.loaded / progress.total * 100);
  11. }
  12. })
  13. .then((res) => {
  14. this.fullscreenLoading = false;
  15. let fileName = decodeURI(res.headers["content-disposition"].split("=")[1]);
  16. let url = window.URL.createObjectURL(new Blob([res.data]));
  17. let link = document.createElement('a');
  18. link.style.display = 'none';
  19. link.href = url;
  20. link.setAttribute('download', fileName);
  21. document.body.appendChild(link)
  22. link.click()
  23. this.$message.success('下载成功');
  24. })
  25. .catch(() => {
  26. this.fullscreenLoading = false;
  27. });
  28. },

下载:

  1. public static class HttpContextExtension
  2. {
  3. /// <summary>
  4. /// 获取客户Ip
  5. /// </summary>
  6. /// <param name="context"></param>
  7. /// <returns></returns>
  8. public static string GetClientUserIp(this HttpContext context)
  9. {
  10. var ip = "";
  11. if (context.Request.Headers.ContainsKey("X-Forwarded-For"))
  12. {
  13. ip = context.Request.Headers["X-Forwarded-For"].ToString();
  14. }
  15. if (string.IsNullOrEmpty(ip) && context.Request.Headers.ContainsKey("X-Real-IP"))
  16. {
  17. ip = context.Request.Headers["X-Real-IP"].ToString();
  18. }
  19. if (string.IsNullOrEmpty(ip))
  20. {
  21. ip = context.Connection.RemoteIpAddress.MapToIPv4().ToString();
  22. }
  23. if (string.IsNullOrEmpty(ip))
  24. return ip;
  25. var sp = ip.RemoveSpacing().Split(',');
  26. return sp[];
  27. }
  28.  
  29. /// <summary>
  30. /// 通过文件流下载文件
  31. /// </summary>
  32. /// <param name="context"></param>
  33. /// <param name="filePath">文件完整路径</param>
  34. /// <param name="contentType">访问这里 https://tool.oschina.net/commons </param>
  35. public static void DownLoadFile(this HttpContext context,string filePath, string contentType= "application/octet-stream")
  36. {
  37. var fileName = Path.GetFileName(filePath);
  38.  
  39. int bufferSize = ;
  40. context.Response.ContentType = contentType;
  41. context.Response.Headers.Append("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName));
  42. context.Response.Headers.Append("Charset", "utf-8");
  43. context.Response.Headers.Append("Access-Control-Expose-Headers", "Content-Disposition");
  44. //context.Response.Headers.Append("Access-Control-Allow-Origin", "*");
  45. //使用FileStream开始循环读取要下载文件的内容
  46. using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
  47. {
  48. using (context.Response.Body)
  49. {
  50. long contentLength = fs.Length;
  51. context.Response.ContentLength = contentLength;
  52.  
  53. byte[] buffer;
  54. long hasRead = ;
  55. while (hasRead < contentLength)
  56. {
  57. if (context.RequestAborted.IsCancellationRequested)
  58. {
  59. break;
  60. }
  61.  
  62. buffer = new byte[bufferSize];
  63. //从下载文件中读取bufferSize(1024字节)大小的内容到服务器内存中
  64. int currentRead = fs.Read(buffer, , bufferSize);
  65. context.Response.Body.Write(buffer, , currentRead);
  66. context.Response.Body.Flush();
  67. hasRead += currentRead;
  68. }
  69. context.Response.Body.Close();
  70. }
  71. fs.Close();
  72. }
  73. }
  74.  
  75. /// <summary>
  76. /// 通过文件流下载文件
  77. /// </summary>
  78. /// <param name="context"></param>
  79. /// <param name="filePath">文件完整路径</param>
  80. /// <param name="contentType">访问这里 https://tool.oschina.net/commons </param>
  81. public static void DownLoadFile(this HttpContext context,string fileName, byte[] fileByte, string contentType = "application/octet-stream")
  82. {
  83. int bufferSize = ;
  84.  
  85. context.Response.ContentType = contentType;
  86. context.Response.Headers.Append("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName));
  87. context.Response.Headers.Append("Charset", "utf-8");
  88. context.Response.Headers.Append("Access-Control-Expose-Headers", "Content-Disposition");
  89.  
  90. //context.Response.Headers.Append("Access-Control-Allow-Origin", "*");
  91. //使用FileStream开始循环读取要下载文件的内容
  92. using (Stream fs = new MemoryStream(fileByte))
  93. {
  94. using (context.Response.Body)
  95. {
  96. long contentLength = fs.Length;
  97. context.Response.ContentLength = contentLength;
  98.  
  99. byte[] buffer;
  100. long hasRead = ;
  101. while (hasRead < contentLength)
  102. {
  103. if (context.RequestAborted.IsCancellationRequested)
  104. {
  105. break;
  106. }
  107.  
  108. buffer = new byte[bufferSize];
  109. //从下载文件中读取bufferSize(1024字节)大小的内容到服务器内存中
  110. int currentRead = fs.Read(buffer, , bufferSize);
  111. context.Response.Body.Write(buffer, , currentRead);
  112. context.Response.Body.Flush();
  113. hasRead += currentRead;
  114. }
  115. }
  116. }
  117. }
  118. }

完美~

.Net Core WebAPI + Axios +Vue 实现下载与下载进度条的更多相关文章

  1. android AsyncTask异步下载并更新进度条

    AsyncTask异步下载并更新进度条    //如果不是很明白请看上篇文章的异步下载 AsyncTask<String, Integer, String> 第一个参数:String 传入 ...

  2. VC下载文件显示进度条

    VC下载文件显示进度条 逗比汪星人2009-09-18上传   by Koma http://blog.csd.net/wangningyu http://download.csdn.net/deta ...

  3. 【转】C#中使用aria2c进行下载并显示进度条

    [转自] C#中使用aria2c进行下载并显示进度条 - 云平台知识库 - 博客园https://www.cnblogs.com/littlehb/p/5782714.html 正则表达式的生成网站: ...

  4. vue+element UI + axios封装文件上传及进度条组件

    1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...

  5. Vue中使用NProgress实现进度条

    简介 NProgress是页面跳转或者发生异步请求是浏览器顶部的进度条 GitHub地址:https://github.com/rstacruz/nprogress 在线演示地址:http://ric ...

  6. VC下载文件 + 显示进度条

    在codeproject里找了许久,发现这样一个VC下载文件并显示进度条的源码,于是添加了些中文注释: 1.下载线程函数: UINT DownloadFile(LPVOID pParam) { CWn ...

  7. idhttp post 上传或下载时显示进度条

    通过 idhttp 带进度条上传演示一下,下载和上传原理差不多,说明一下下面例子中的的idhttp 是动态创建的 第一步:添加一个StatusBar或者gauge 进度条,这2个都可以.我用的是 st ...

  8. webclient下载文件 带进度条

    private void button1_Click(object sender, EventArgs e) { doDownload(textBox1.Text.Trim()); } private ...

  9. Android开发(24)---安卓中实现多线程下载(带进度条和百分比)

    当我们学完java中多线程的下载后,可以将它移植到我们的安卓中来,下面是具体实现源码: DownActivity.java package com.example.downloads; import ...

随机推荐

  1. Failed to start mongod.service: Unit not found

    其实自己用惯的是MYSQL,然后项目最后一步完善数据读写的部分,本来打算用mysql的,然而在centOS系统上发现安装总是出问题,后来查找一下资料,发现centOS系统上一般用的是Mariadb,这 ...

  2. MySQL事务操作

    在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作.因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION ...

  3. Spring Boot 教程 (3) - RESTful

    Spring Boot 教程 - RESTful 1. RESTful风格 1.1 简介与特点 RESTful是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式 ...

  4. javascript代码重构需要考虑的问题(一)

    1.将数组的长度进行存储,循环时就不用每次去读取一次数组长度,从而提升性能 例如: for (var i = 0, len = arr.length; i < len; i++) { //do ...

  5. 本地安装并运行http-server、browser-sync、webpack

    有一些自带命令的辅助开发.测试类的工具,官方都推荐全局安装,如果不想全局安装只想在某个项目下用该怎么办呢? 如http-server.browser-sync.webpack这种自带CLI的工具 使用 ...

  6. tp入门

    其中可以配置隐藏看入口文件 和默认读取路径 <?php namespace app\admin\controller; //生命控制器 class Index { public function ...

  7. 【HTTP】HTTP报文&状态码

    HTTP报文中的HTTP信息 一.编码提升传输速率 编码的好处:有效处理大量的访问请求 编码的弊端:会消耗更多的CPU资源 报文主体&实体主体 报文:HTTP通信的基本单元,8位组字节流组成, ...

  8. (八)Filter&ThreadLocal实现处理事务

    ConnectionContext.java package com.aff.bookstore.web; import java.sql.Connection; public class Conne ...

  9. C实现进程间通信(管道; 共享内存,信号量)

    最近学习了操作系统的并发:以下是关于进程间实现并发,通信的两个方法. 例子: 求100000个浮点数的和.要求: (1)随机生成100000个浮点数(父进程). (2)然后创建4个后代进程,分别求25 ...

  10. seacms_6.4.5 前台任意代码执行漏洞分析

    环境搭建 1.下载安装包 下载地址: 链接:https://pan.baidu.com/s/1uw_VnxnvG4GGEae4TRsGGw 密码:cd48 2.常规安装 漏洞复现 poc1: http ...