.Net Core WebAPI + Axios +Vue 实现下载与下载进度条
故事的开始
老板说:系统很慢,下载半个小时无法下载,是否考虑先压缩再给用户下载?
本来是已经压缩过了,不过第一反应应该是用户下的数量多,导致压缩包很大,然后自己测试发现,只是等待的时间比较久而已,仍然是下载状态中,并不是系统慢,但是用户体验肯定是最直观的,确实是我们做得不够好,单纯弹出遮罩层显示冰冷的“拼命加载中……”,对用户来说确实不够友好。嗯,了解实际情况了,那就开撸,增加用户体验。
解决它
效果图:
Vue+ElementUI
- <el-progress v-if="dlProgress>0" :text-inside="true" :stroke-width="18" :percentage="dlProgress" status="success" style="margin-bottom:10px"></el-progress>
Axios
- downloadTask(index,row) {
- let own =this;
- this.fullscreenLoading = true;
- this.axios({
- method: 'post',
- url: this.baseUrl + '/api/Task/DownLoad',
- data: {id: row.id},
- responseType: 'blob',
- onDownloadProgress (progress) {
- own.dlProgress=Math.round(progress.loaded / progress.total * 100);
- }
- })
- .then((res) => {
- this.fullscreenLoading = false;
- let fileName = decodeURI(res.headers["content-disposition"].split("=")[1]);
- let url = window.URL.createObjectURL(new Blob([res.data]));
- let link = document.createElement('a');
- link.style.display = 'none';
- link.href = url;
- link.setAttribute('download', fileName);
- document.body.appendChild(link)
- link.click()
- this.$message.success('下载成功');
- })
- .catch(() => {
- this.fullscreenLoading = false;
- });
- },
下载:


- public static class HttpContextExtension
- {
- /// <summary>
- /// 获取客户Ip
- /// </summary>
- /// <param name="context"></param>
- /// <returns></returns>
- public static string GetClientUserIp(this HttpContext context)
- {
- var ip = "";
- if (context.Request.Headers.ContainsKey("X-Forwarded-For"))
- {
- ip = context.Request.Headers["X-Forwarded-For"].ToString();
- }
- if (string.IsNullOrEmpty(ip) && context.Request.Headers.ContainsKey("X-Real-IP"))
- {
- ip = context.Request.Headers["X-Real-IP"].ToString();
- }
- if (string.IsNullOrEmpty(ip))
- {
- ip = context.Connection.RemoteIpAddress.MapToIPv4().ToString();
- }
- if (string.IsNullOrEmpty(ip))
- return ip;
- var sp = ip.RemoveSpacing().Split(',');
- return sp[];
- }
- /// <summary>
- /// 通过文件流下载文件
- /// </summary>
- /// <param name="context"></param>
- /// <param name="filePath">文件完整路径</param>
- /// <param name="contentType">访问这里 https://tool.oschina.net/commons </param>
- public static void DownLoadFile(this HttpContext context,string filePath, string contentType= "application/octet-stream")
- {
- var fileName = Path.GetFileName(filePath);
- int bufferSize = ;
- context.Response.ContentType = contentType;
- context.Response.Headers.Append("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName));
- context.Response.Headers.Append("Charset", "utf-8");
- context.Response.Headers.Append("Access-Control-Expose-Headers", "Content-Disposition");
- //context.Response.Headers.Append("Access-Control-Allow-Origin", "*");
- //使用FileStream开始循环读取要下载文件的内容
- using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
- {
- using (context.Response.Body)
- {
- long contentLength = fs.Length;
- context.Response.ContentLength = contentLength;
- byte[] buffer;
- long hasRead = ;
- while (hasRead < contentLength)
- {
- if (context.RequestAborted.IsCancellationRequested)
- {
- break;
- }
- buffer = new byte[bufferSize];
- //从下载文件中读取bufferSize(1024字节)大小的内容到服务器内存中
- int currentRead = fs.Read(buffer, , bufferSize);
- context.Response.Body.Write(buffer, , currentRead);
- context.Response.Body.Flush();
- hasRead += currentRead;
- }
- context.Response.Body.Close();
- }
- fs.Close();
- }
- }
- /// <summary>
- /// 通过文件流下载文件
- /// </summary>
- /// <param name="context"></param>
- /// <param name="filePath">文件完整路径</param>
- /// <param name="contentType">访问这里 https://tool.oschina.net/commons </param>
- public static void DownLoadFile(this HttpContext context,string fileName, byte[] fileByte, string contentType = "application/octet-stream")
- {
- int bufferSize = ;
- context.Response.ContentType = contentType;
- context.Response.Headers.Append("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName));
- context.Response.Headers.Append("Charset", "utf-8");
- context.Response.Headers.Append("Access-Control-Expose-Headers", "Content-Disposition");
- //context.Response.Headers.Append("Access-Control-Allow-Origin", "*");
- //使用FileStream开始循环读取要下载文件的内容
- using (Stream fs = new MemoryStream(fileByte))
- {
- using (context.Response.Body)
- {
- long contentLength = fs.Length;
- context.Response.ContentLength = contentLength;
- byte[] buffer;
- long hasRead = ;
- while (hasRead < contentLength)
- {
- if (context.RequestAborted.IsCancellationRequested)
- {
- break;
- }
- buffer = new byte[bufferSize];
- //从下载文件中读取bufferSize(1024字节)大小的内容到服务器内存中
- int currentRead = fs.Read(buffer, , bufferSize);
- context.Response.Body.Write(buffer, , currentRead);
- context.Response.Body.Flush();
- hasRead += currentRead;
- }
- }
- }
- }
- }
完美~
.Net Core WebAPI + Axios +Vue 实现下载与下载进度条的更多相关文章
- android AsyncTask异步下载并更新进度条
AsyncTask异步下载并更新进度条 //如果不是很明白请看上篇文章的异步下载 AsyncTask<String, Integer, String> 第一个参数:String 传入 ...
- VC下载文件显示进度条
VC下载文件显示进度条 逗比汪星人2009-09-18上传 by Koma http://blog.csd.net/wangningyu http://download.csdn.net/deta ...
- 【转】C#中使用aria2c进行下载并显示进度条
[转自] C#中使用aria2c进行下载并显示进度条 - 云平台知识库 - 博客园https://www.cnblogs.com/littlehb/p/5782714.html 正则表达式的生成网站: ...
- vue+element UI + axios封装文件上传及进度条组件
1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...
- Vue中使用NProgress实现进度条
简介 NProgress是页面跳转或者发生异步请求是浏览器顶部的进度条 GitHub地址:https://github.com/rstacruz/nprogress 在线演示地址:http://ric ...
- VC下载文件 + 显示进度条
在codeproject里找了许久,发现这样一个VC下载文件并显示进度条的源码,于是添加了些中文注释: 1.下载线程函数: UINT DownloadFile(LPVOID pParam) { CWn ...
- idhttp post 上传或下载时显示进度条
通过 idhttp 带进度条上传演示一下,下载和上传原理差不多,说明一下下面例子中的的idhttp 是动态创建的 第一步:添加一个StatusBar或者gauge 进度条,这2个都可以.我用的是 st ...
- webclient下载文件 带进度条
private void button1_Click(object sender, EventArgs e) { doDownload(textBox1.Text.Trim()); } private ...
- Android开发(24)---安卓中实现多线程下载(带进度条和百分比)
当我们学完java中多线程的下载后,可以将它移植到我们的安卓中来,下面是具体实现源码: DownActivity.java package com.example.downloads; import ...
随机推荐
- Failed to start mongod.service: Unit not found
其实自己用惯的是MYSQL,然后项目最后一步完善数据读写的部分,本来打算用mysql的,然而在centOS系统上发现安装总是出问题,后来查找一下资料,发现centOS系统上一般用的是Mariadb,这 ...
- MySQL事务操作
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作.因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION ...
- Spring Boot 教程 (3) - RESTful
Spring Boot 教程 - RESTful 1. RESTful风格 1.1 简介与特点 RESTful是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式 ...
- javascript代码重构需要考虑的问题(一)
1.将数组的长度进行存储,循环时就不用每次去读取一次数组长度,从而提升性能 例如: for (var i = 0, len = arr.length; i < len; i++) { //do ...
- 本地安装并运行http-server、browser-sync、webpack
有一些自带命令的辅助开发.测试类的工具,官方都推荐全局安装,如果不想全局安装只想在某个项目下用该怎么办呢? 如http-server.browser-sync.webpack这种自带CLI的工具 使用 ...
- tp入门
其中可以配置隐藏看入口文件 和默认读取路径 <?php namespace app\admin\controller; //生命控制器 class Index { public function ...
- 【HTTP】HTTP报文&状态码
HTTP报文中的HTTP信息 一.编码提升传输速率 编码的好处:有效处理大量的访问请求 编码的弊端:会消耗更多的CPU资源 报文主体&实体主体 报文:HTTP通信的基本单元,8位组字节流组成, ...
- (八)Filter&ThreadLocal实现处理事务
ConnectionContext.java package com.aff.bookstore.web; import java.sql.Connection; public class Conne ...
- C实现进程间通信(管道; 共享内存,信号量)
最近学习了操作系统的并发:以下是关于进程间实现并发,通信的两个方法. 例子: 求100000个浮点数的和.要求: (1)随机生成100000个浮点数(父进程). (2)然后创建4个后代进程,分别求25 ...
- seacms_6.4.5 前台任意代码执行漏洞分析
环境搭建 1.下载安装包 下载地址: 链接:https://pan.baidu.com/s/1uw_VnxnvG4GGEae4TRsGGw 密码:cd48 2.常规安装 漏洞复现 poc1: http ...