Blazor 中如何下载文件到浏览器

Blazor 中如何下载文件到浏览器

目录

一、前言

二、方法一(导航跳转)

三、方法二(下载后传出)

(一) 使用 RestSharp 下载

(二) 使用 BlazorDownloadFile 传出

独立观察员 2021 年 3 月 28 日

一、前言

最近想给之前文章《下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)》中提到的 VPS 文件中转下载服务添加一个前端页面,其实之前也想使用热门的前端框架 Vue 来做,也做了点工作了,但是毕竟不是前端开发,上手起来还是比较慢的,而且引入了 NodeJS 等技术栈,和后端的 ASP.NET Core WebApi 也不共存于一个项目,开发和维护起来不太方便。后来了解到了发展如火如荼的 Blazor 框架,这个是微软开发的 .NET 领域的前端框架,在某种程度上和以前的 WebForm 有点类似,不过以前那个是微软自己搞的,大家都不待见它,现在这个是符合 Web 领域新标准 WebAssembly,而且 UI 方面也可以使用现有的成熟库。总之,使用 Blazor,可以使用 C# 代码来代替(当然也是兼容的)JavaScript 代码,使 .NET 开发人员能有极致的全栈开发体验,颠覆以往那种 “师夷长技以制夷” 的前端开发方式,所以决定学习使用一下。另外,本文的 Blazor 项目使用 Blazor Server 模式,而不是 Blazor WebAssembly 模式。

 

先来前情回顾一下,关键就是 WebApi 项目提供了一个 Download 控制器的 Get 方法:

/// <summary>
/// 通过 HttpClient 获取另外站点的文件流,再输出
/// </summary>
[HttpGet]
publicasync Task<IActionResult>Get(string url)
{if(string.IsNullOrWhiteSpace(url)){_logger.LogTrace("下载地址为空!");returnContent("请在链接后跟上下载地址后再次访问");}try{// 解决 CentOS7 Https 下载地址出错的问题;var httpClientHandler = new HttpClientHandler{ServerCertificateCustomValidationCallback = (message, certificate2, arg3, arg4) =>true};using HttpClient client = newHttpClient(httpClientHandler);var stream = await client.GetStreamAsync(url);returnFile(stream,"application/octet-stream", // 二进制流Path.GetFileName(url));}catch(Exception ex){returnContent($" 出错了:{ex}");}
}

 

之前是使用 Swagger 测试的,实际上用 Postman 也可以测试:

 

二、方法一(导航跳转)

那么我们在 Blazor 中如何调用呢?先来看个简单的:

 

可以看到直接使用 Navigation.NavigateTo 跳转到相关 WebApi 地址即可。由于该接口返回二进制流,浏览器就能直接识别进行下载了(动图):

 

这种方法只是起个跳转的作用,实际下载动作还是在 WebApi  那边进行,缺点是下载结果不可知,优点是下载过程可见。

这个实际上不是本文讨论的重点,本文讨论的是,使用代替了 JS 代码的 C# 代码来下载文件到浏览器。

 

三、方法二(下载后传出)

那么如何实现呢?这个要分两步走,第一步是使用代码调用 API 进行下载文件,第二步是使用某种方法把文件通过浏览器传出给用户。

 

(一) 使用 RestSharp 下载

先来看看第一步,这里我们通过 Postman 得知可以使用 RestSharp 进行调用:

 

我们通过 NuGet 安装 RestSharp 后,代码可以这样写:

var client = newRestClient($"http://frps.dlgcy.com:5000/Download?url={Url}");
var request = newRestRequest(Method.GET);
var response = await client.ExecuteAsync(request);if(response.IsSuccessful)
{Tips = "下载成功!";var content = response.Content;var contentBytes = response.RawBytes;await BlazorDownloadFileService.DownloadFile(Path.GetFileName(Url), contentBytes, "application/octet-stream");
}
else
{Tips = "下载失败!";
}

 

(二) 使用 BlazorDownloadFile 传出

再来看看第二步,把下载的文件传出给用户,方法就是使用 BlazorDownloadFile 开源方案。

GitHub 地址:https://github.com/arivera12/BlazorDownloadFile

Blazor download files to the browser from c# without any JavaScript library or dependency.

BlazorDownloadFile is the solution to saving files on the client-side, and is perfect for web apps that generates files on the client.

However if the file is coming from the server we recommend you to first try to use Content-Disposition attachment response header as it has more cross-browser compatibility.

 

翻译:

在 Blazor 中通过 C#(不使用任何 JS 库和依赖)下载文件到浏览器。

BlazorDownloadFile 是在客户端保存文件的解决方案,它对于在客户端生成文件的应用来说是完美的。

然而如果文件是来自服务端,我们建议您优先使用 Content-Disposition 附件响应头,因为它有更好的跨浏览器兼容性。

 

1、安装(NuGet)

Install-Package BlazorDownloadFile -Version 2.1.6

 

2、添加服务

在 Startup 的 ConfigureServices () 中添加:

services.AddBlazorDownloadFile();

 

3、在 Blazor 的 Razor 页面中使用

// 在页首添加引用:
@using BlazorDownloadFile// 在 code 中注入:
[Inject] IBlazorDownloadFileService BlazorDownloadFileService {get; set; }// 使用(这里是先获得了文件的字节数组再调用本方法)
await BlazorDownloadFileService.DownloadFile(Path.GetFileName(Url), contentBytes, "application/octet-stream");

 

图示:

 

这样就可以根据下载是否成功来分别处理,成功时传出文件给用户,缺点是下载过程用户不可知,还需优化,效果如下(动图):

最后给出源码地址:

https://gitee.com/dlgcy/VPSDownloader.NET/tree/Blog20210328

 

全文完,感谢阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

荐书 | 5本数学科普让你不再“畏惧”数学,感受数学的内在美

最近&#xff0c;小木了解了许多关于数学的书籍&#xff0c;简直打开了小木数学新世界的大门。出版社寄了一些样书给小木&#xff0c;经过斟酌对比之后&#xff0c;推荐以下5本数学科普书给大家。01《数学简史》[中] 蔡天新 43.50提到数学&#xff0c;很多人的第一反应就是复杂…

ASP.NET Core依赖注入初识与思考

一、前言在上一篇中&#xff0c;我们讲述了什么是控制反转(IoC)以及通过哪些方式实现的。这其中&#xff0c;我们明白了&#xff0c;「控制反转&#xff08;IoC&#xff09;」 是一种软件设计的模式&#xff0c;指导我们设计出更优良&#xff0c;更具有松耦合的程序&#xff0c…

memcached mysql缓存_memcached做数据库缓存

最近研究memcache小有成果&#xff0c;把经验分享出来。白话:很早就听说memcache了&#xff0c;一直没搞懂&#xff0c;后来又看到redis很火&#xff0c;可以用来做缓存&#xff0c;研究了半天也没搞懂咋个做缓存&#xff0c;后来也不纠结了&#xff0c;继续学习python,当对pyt…

掌握Python爬虫基础,仅需1小时!

随着互联网的发展&#xff0c;google、百度等搜索引擎让我们获取信息愈加方便。但需求总会不断涌现&#xff0c;纯粹地借助百度等收集信息是远远不够的&#xff0c;因此编写爬虫爬取信息的重要性就越发凸显。比如有人为了炒股&#xff0c;专门爬取了多种股票信息&#xff1b;也…

我看ITIL在中国(六):如何建立有中国特色的IT运维管理平台【二】

在开始筹划建设有“中国特色的IT运维管理平台”之前&#xff0c;先来看看我们目前面临的情况&#xff1a; 随着信息化建设的不断深入&#xff0c;各种企业的核心业务都逐步地迁移到IT平台上来&#xff0c;对IT管理的要求也越来越高&#xff0c;IT需要管理&#xff0c;向IT管理要…

史上首次!世界杯使用视频裁判

2018年6月16日18时&#xff0c;法国队在喀山中央球场迎来了他们本届世界杯的首场比赛&#xff0c;对手是澳大利亚队。比赛进行到第56分钟&#xff0c;格列兹曼接到队友的直塞球&#xff0c;单刀杀入禁区&#xff0c;澳大利亚后卫里斯登铲球&#xff0c;但并没有碰到皮球&#x…

二分查找和折半插入排序一块说说-很合适~~~

前言上一篇在聊时间复杂度和空间复杂度时&#xff0c;没有按指定格式显示(明明预览的时候没问题的)&#xff0c;强迫症的我稍微优化了一下重新发布&#xff0c;目的就是让小伙伴看着舒服。上次聊到的直接插入排序在比较有序数据和待插入数据时&#xff0c;是通过依次遍历的方式…

用Python更加了解微信好友

用了微信几年了&#xff0c;微信号有也不少了&#xff0c;但是真正了解自己的好友吗&#xff1f;好友最多的城市是哪个&#xff1f;好友男女比例是多少&#xff1f;好友签名都是什么&#xff1f;今天我们来充分了解自己的微信好友。运行平台&#xff1a; Windows Python版本&a…

Linux下配置DNS

Linux下配置DNS一、配置环境1.Linux操作系统版本&#xff1a;RedHat AS 52.网络环境设置&#xff1a;IP&#xff1a;192.168.1.1 NetMark&#xff1a;255.255.255.0 Getway&#xff1a;192.168.1.13.软件包的准备&#xff1a;1&#xff09;bind-9.3.3-7.el5.i386.rpm …

python用pandas提取行列_python- pandas 不删除符合条件的行和列

我正在尝试建立一个回归模型,以便根据出现的单词来预测收视率(1-5)(回归本身并不一定表现良好,更多的是关于所采用的方法).我使用以下代码创建了一个词频矩阵&#xff1a;bow df.Review2.str.split().apply(pd.Series.value_counts)看起来像这样&#xff1a;我现在有兴趣删除在…

中国宜坚持发展自主操作系统

一直以来&#xff0c;我国IT产业存在“缺芯少魂”的问题&#xff0c;芯指的是芯片&#xff0c;魂指的是操作系统。操作系统是连接硬件和应用软件的媒介和桥梁。如果无法在操作系统方面实现安全可控&#xff0c;整个信息安全就无从谈起&#xff0c;而恰恰当下国内桌面操作系统市…

老板啥都懂,还天天套路我?!

今天我被老板叫到办公室进行了一场“推心置腹”的对话▼来源&#xff1a;特大号文章版权归原作者所有&#xff0c;转载仅供学习使用&#xff0c;不用于任何商业用途&#xff0c;如有侵权请留言联系删除&#xff0c;感谢合作。

如何提高电脑办公效能

其实你只要花一点点的时间&#xff0c;就可以使你的生活变得更好。在电脑办公上&#xff0c;记忆几个快捷键、安装一些实用的软件等绝对会让你的效率翻倍&#xff01; 在此弥缝分享几条我常常使用到的技巧和软件&#xff1a; 熟练一些快捷键 熟练的快捷键越多&#xff0c;做事越…

BeetleX.Http.Clients访问https服务

最近在做数据分析平台&#xff0c;那在做这个产品的时最需要的自然是测试数据&#xff0c;自己去构建行业测试数据比较麻烦&#xff0c;看到有同行产品的演示数据当然不能错过。由于采集过程中使用到BeetleX.Http.Clients去抓取第三方的Https接口数据&#xff0c;所以顺便记录一…

这一次,用数据解读玩家行为,用实力拿下预测大奖!

如今&#xff0c;大数据落地应用已十分广泛&#xff0c;除了政务、金融、医疗、旅游等传统行业外&#xff0c;在游戏行业中的应用也逐渐受人瞩目。那么&#xff0c;当大数据遇上游戏产业&#xff0c;会产生哪些变革和创新呢&#xff1f;众所周知&#xff0c;全球游戏市场规模庞…

如何在 C# 中使用隐式和显式操作符

C# 有一个鲜为人知的特性是通过定义 显式和隐式操作符 实现类型之间的转换&#xff0c;这篇文章我们将会讨论如何使用这些 显式 和 隐式 操作符。什么是显式&#xff0c;什么是隐式 隐式类型转换 它是运行时自动帮你完成的&#xff0c;言外之意就是你不需要人为干预&#xff0c…

SUSE10下配置FTP服务

SUSE10 liuux下配置FTP和SUSE9有不同之处&#xff0c;大家请注意。下面为SUSE10下ftp服务配置具体步骤。 Linux 系统安装完成后&#xff0c;默认不会开启FTP 服务&#xff0c;需要在yast界面下进行手动启动: 说明&#xff1a;如果未安装FTP 包&#xff0c;则需要先行安装FTP 软…

java gzip 解压文件_Java实现文件压缩与解压[zip格式,gzip格式]

原文&#xff1a;http://www.cnblogs.com/visec479/p/4112881.html#3069573Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术&#xff0c;可以对单个文件和任意级联文件夹进行压缩和解压&#xff0c;对于一些初学者来说是个很不错的实例。zip扮演着归档和压缩两…

来看一场 AI 重建的 3D 全息世界杯比赛!

世界杯来了&#xff01;央视名嘴白岩松调侃 “俄罗斯世界杯&#xff0c;中国除了足球队没去&#xff0c;其他的都去了”&#xff0c;这届世界杯&#xff0c;中国球迷购买球票的数量在所有国家中排名第 9&#xff0c;可见球迷对世界杯的热情。那么&#xff0c;除了准备好小龙虾在…

编译Linux 2.6内核

编译内核易如反掌。让人叹为观止的是&#xff0c;这实际上比编译和安装像glibc这样的系统级组伴还要简单。2.6内核提供了一套新工具&#xff0c;使编译内核更加容易&#xff0c;比早期发布的内核有了长足的进步。 2.3.1 配置内核 因为Linux源码随手可得&#xff0c;那就意味着在…