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

全文完,感谢阅读。

Blazor 中如何下载文件到浏览器相关推荐

  1. 异步下载文件 java_在浏览器中异步下载文件监听下载进度

    在浏览器中异步下载文件,其实就是把服务器响应的文件先保存在内存中.然后再一次下载到磁盘.第二次下载过程,就是把内存的数据IO到磁盘,没有网络开销.速度极快. 之所以要先保存在内存,主要是可以在下载开始 ...

  2. js如何在浏览器中运行php文件下载,JavaScript_用JS在浏览器中创建下载文件,但受限于浏览器,很多情况下 - phpStudy...

    用JS在浏览器中创建下载文件 但受限于浏览器,很多情况下我们都只能给出个链接,让用户点击打开->另存为.如下面这个链接: file.js 用户点击这个链接的时候,浏览器会打开并显示链接指向的文件 ...

  3. 使用a标签下载文件,浏览器会直接打开解决方案

    使用a标签下载文件,浏览器会直接打开解决方案 背景 一.HTML中的a标签实现点击下载 二.即使使用a标签的download属性,chrome浏览器还是会打开 三.解决方案 解决方案一:使用ajax请 ...

  4. java获取默认下载路径吗_java下载文件到浏览器默认路径

    java下载文件到浏览器默认路径 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog..net/mengmeng2222222 一.controller层代码: @Requ ...

  5. android下载通知栏,Android开发中实现下载文件通知栏显示进度条

    android开发中实现下载文件通知栏显示进度条. 1.使用asynctask异步任务实现,调用publishprogress()方法刷新进度来实现(已优化) public class myasync ...

  6. 【踩坑】Linux java中ftp下载文件,解压文件损坏,以及图片下载打开只显示下载路径的问题

    [踩坑]Linux java中ftp下载文件,解压文件损坏,以及图片下载打开只显示下载路径的问题 一. 问题重现 二. 问题解决思路 1. 确认是不是上传就导致数据出错了 2. 是不是平台问题 三. ...

  7. java byte 图片浏览器直接显示_以Spring Boot的方式显示图片或下载文件到浏览器的示例代码...

    以Java web的方式显示图片到浏览器以Java web的方式下载服务器文件到浏览器 以Spring Boot的方式显示图片或下载文件到浏览器 请求例子:http://localhost:8080/ ...

  8. java 通过url下载文件到浏览器

    前端传来url地址与文件名,下载文件到浏览器 代码 (这里模拟,直接在代码里写了url,可以拼接在url后进行截取) 请求接口 @GetMapping("/findOperatorBarVO ...

  9. vue项目中点击button下载文件到浏览器

    代码实现 在src 下面的 directive 文件夹下新建目录 down-load-url down-load-url / index.js文件 /*index.js文件* 后端返回文件的url,前 ...

最新文章

  1. 【iOS】iOS10.3新增API:应用内评分
  2. 滴滴AI Labs负责人叶杰平离职!CTO 张博接任
  3. findwindowex子窗口类型有哪几种_SQL-窗口函数
  4. opencv3 for python 之 创建图片绘制简单几何图形
  5. mac安装telnet 超简单 复制telnet文件即可
  6. 桑文锋PMCAFF之行:数据驱动产品和运营决策
  7. Spring源码之bean的加载(四)获取单例
  8. 5.WEB版QQ多人聊天,带离线留言功能
  9. 25. (附加)二叉树的所有路径(C++版本)
  10. 【大数据部落】R语言GAM(广义相加模型)对物业耗电量进行预测
  11. IP地址的两种表示方法:整数和点分十进制
  12. Numpy 笔记(二): 多维数组的切片(slicing)和索引(indexing)
  13. 涉密计算机分区保护,VeraCrypt - 创建加密分区保护计算机上需要保密的文件
  14. matlab中magy是什么意思,MATLAB入门基本知识——音频处理
  15. 2022“杭电杯”中国大学生算法设计超级联赛(8)补题 1011 (持续更新中)
  16. 对话系统论文集(1)-BBQ网络
  17. html中屏幕文字轮播怎么做,如何制作网页滚动文字(html)(一)
  18. Viewstate verification failed 解决办法
  19. JAVAMail 使用imap协议分析邮件
  20. java输出字符串的长度_Java格式化字串输出固定长度

热门文章

  1. java标记错误_标记电子邮件Java时出错
  2. mysql查询条件为or_使用mysql查询where条件里的or和and
  3. 利用airTest的图像实别技术测试Web应用
  4. 前端工程师面试题汇总
  5. js 控制超出字数显示省略号
  6. ASP.NET登录以及注册
  7. 深入理解BS结构应用程序
  8. Yii框架里用grid.CGridView调用pager扩展不显示最后一页按钮的解决
  9. 在Word XP中也能插入国际音标、拼音
  10. 在Windows 7中禁用或修改Aero Peek的“延迟时间”