Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >这是Blazor上传文件的最佳方式吗?

这是Blazor上传文件的最佳方式吗?

作者头像
沙漠尽头的狼
发布于 2022-03-26 01:45:08
发布于 2022-03-26 01:45:08
1.5K00
代码可运行
举报
文章被收录于专栏:Dotnet9Dotnet9
运行总次数:0
代码可运行

Blazor不得不说真是好东西,极大的提升了开发效率,很多的页面交互功能基本上只需要写很少的代码就能实现了,而且还是无js实现,你也绝对没有想到过,Blazor实现文件上传是有多么简单!

先说结论:Blazor实现带进度显示的文件上传真的很简单!效果看图:

实现这么一个小功能,仅仅只花了不到50行的代码就实现了,接下来就给大家分享下案例实现吧。

首先引入Tewr.Blazor.FileReader包,这个包能够提供文件上传的流式读取,这样便可以实现在服务端对上传文件进行一边上传一遍写文件的操作。

配置依赖注入(站长注:这是Blazor Server模式,wasm方式请查看文末仓库文档说明):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddFileReaderService();

接下来我们先进行页面布局,很简单,再声明两个变量用于显示进度和显示图片:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input type="file"/><button>上传文件</button>
<div>
    @if (!string.IsNullOrEmpty(_src))
    {
        <img src="@_src" width="600px" />
    }
    else
    {
        <p>@progress</p>
    }
</div>

然后在组件中注入IFileReaderService服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@using Tewr.Blazor.FileReader
@inject IFileReaderService fileReaderService;

为了让文件框能够和C#代码进行交互,所以需要将它通过ElementReference引用起来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input @ref=inputTypeFileElement type="file" /><button>上传文件</button>
<div>
    @if (!string.IsNullOrEmpty(_src))
    {
        <img src="@_src" width="600px" />
    }
    else
    {
        <p>@progress</p>
    }
</div>
@code {
    private ElementReference inputTypeFileElement;
    private string _src;
    private string progress;
}

给按钮绑定事件,按钮触发后通过fileReaderService进行文件流的读取,接下来便是常规的二进制数据copy操作,可以拿到文件的传输进度,计算之后便能显示到页面中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<button @onclick=ReadFile>上传文件</button>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public async Task ReadFile()
{
    _src = "";
    foreach (var file in await fileReaderService.CreateReference(inputTypeFileElement).EnumerateFilesAsync())
    {
        await using var fileStream = await file.OpenReadAsync();
        var buffer = new byte[2048];
        var finalBuffer = new byte[fileStream.Length];
        int count;
        int totalCount = 0;
        while ((count = await fileStream.ReadAsync(buffer, 0, buffer.Length)) != 0)
        {
            Buffer.BlockCopy(buffer, 0, finalBuffer, totalCount, count);
            totalCount += count;
            progress = "文件上传中 " + (int)(totalCount * 100.0 / fileStream.Length) + "%";
            StateHasChanged();
        }
        _src = $"data:image/jpg;base64,{Convert.ToBase64String(finalBuffer)}";
        progress = "";
        StateHasChanged();
    }
}

完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@page "/counter"
@using Tewr.Blazor.FileReader
@inject IFileReaderService fileReaderService;
 
<input @ref=inputTypeFileElement type="file" />
<button @onclick=ReadFile>上传文件</button>
<div>
    @if (!string.IsNullOrEmpty(_src))
    {
        <img src="@_src" width="600px" />
    }
    else
    {
        <p>@progress</p>
    }
</div>
 
@code {
    private ElementReference inputTypeFileElement;
    private string _src;
    private string progress;
 
    public async Task ReadFile()
    {
        _src = "";
        foreach (var file in await fileReaderService.CreateReference(inputTypeFileElement).EnumerateFilesAsync())
        {
            await using var fileStream = await file.OpenReadAsync();
            var buffer = new byte[2048];
            var finalBuffer = new byte[fileStream.Length];
            int count;
            int totalCount = 0;
            while ((count = await fileStream.ReadAsync(buffer, 0, buffer.Length)) != 0)
            {
                Buffer.BlockCopy(buffer, 0, finalBuffer, totalCount, count);
                totalCount += count;
                progress = "文件上传中 " + (int)(totalCount * 100.0 / fileStream.Length) + "%";
                StateHasChanged();
            }
            _src = $"data:image/jpg;base64,{Convert.ToBase64String(finalBuffer)}";
            progress = "";
            StateHasChanged();
        }
    }
}

站长插播:

文章首图演示的是一张不到1MB的图片,因为Tewr.Blazor.FileReader这个包提供文件上传的流式读取,上传大文件也是可以的,下面这是上传一个34.2MB的ZIP压缩包,Blazor服务端模式:

demo做的一般,可能gif看不出啥,只是为了证明这个包确实不错,要实现大文件上传,可把上面单包读取大小改大一点,比如:512KB:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var buffer = new byte[1024*512];

如果看下方微软Blazor文件上传文档,把单包大小改成大于20KB,页面可能会卡一下,然后页面自动刷新就把上传操作给重置了,而使用这个包确没这个问题,这个包很nice。

OK,本文完。

参考

  • Blazor实现文件上传带进度显示案例分享[1]
  • https://github.com/Tewr/BlazorFileReader[2]
  • https://docs.microsoft.com/zh-cn/aspnet/core/blazor/file-uploads?view=aspnetcore-6.0&pivots=server[3]

参考资料

[1]

Blazor实现文件上传带进度显示案例分享: https://masuit.com/1676

[2]

https://github.com/Tewr/BlazorFileReader: https://github.com/Tewr/BlazorFileReader

[3]

https://docs.microsoft.com/zh-cn/aspnet/core/blazor/file-uploads?view=aspnetcore-6.0&pivots=server: https://docs.microsoft.com/zh-cn/aspnet/core/blazor/file-uploads?view=aspnetcore-6.0&pivots=server

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Dotnet9 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET Core文件上传与下载(多种上传方式)
前言 前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了. 打算写个系列,但是还没想好目录,今天先来一篇,后面在整理吧. ASP.NET Core 2.0 发展到现在,已经很成熟了.下个项目争取使用吧. 正文 1.使用模型绑定上传文件(官方例子) 官方机器翻译的地址:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads 这里吐槽一下 - -,这TM的机器翻译..还不如自己看E文的.. 首先我们需要
GuZhenYin
2018/03/30
5.8K0
ASP.NET Core文件上传与下载(多种上传方式)
.net上传文件,大文件及下载方式汇总(转)
原文地址:http://www.360doc.com/content/19/1219/10/67993814_880731215.shtml
用户7053485
2020/03/12
1.1K0
PHP+AjaxForm异步带进度条上传文件实例代码
在使用ajaxForm方法之前,首先需要安装form.js的插件,网上有; 一、首先说用法,ajaxForm可以接收0或1个参数,该参数可以是一个变量、一个对象或回调函数,这个对象主要有以下参数:
用户2323866
2021/06/29
1.4K0
.net通过boundary上传文件
public void UploadVedio(string fileName) { fileName = "input_video_only_3sec.mp4"; byte[] vedioBytes = null; using (FileStream fileStream = new FileStream(@"D:\缓存内容\test.mp4", FileMode.Open, FileAccess.Read))
SingYi
2022/07/13
5520
.net通过boundary上传文件
大文件上传切片上传 vue java
使用vue+elementui进行前端开发, 实现在dialog中 带进度条的上传大文件页面
solate
2020/06/18
6.8K1
写给新手前端的各种文件上传攻略,从小图片到大文件断点续传
今年国庆假期终于可以憋在家里了不用出门了,不用出去看后脑了,真的是一种享受。这么好的光阴怎么浪费,睡觉、吃饭、打豆豆这怎么可能(耍多了也烦),完全不符合我们程序员的作风,赶紧起来把文章写完。
coder_koala
2019/11/04
3.2K0
写给新手前端的各种文件上传攻略,从小图片到大文件断点续传
MVC5:使用Ajax和HTML5实现文件上传功能
引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能。 基本功能:实现带有进度条的文件上传功能 高级功能:通过拖拽文件的操作实现多个文件上传功能 背景 HTML5提供了一种标准的访问本地文件的方法——File API规格说明,通过调用File API 能够访问文件信息,也可以利用客户端来验证上传文件的类型和大小是否规范。 该规格说明包含以下几个接口来使用文件: File接口:具有文件的“读权限”,可以
葡萄城控件
2018/01/10
4.3K0
MVC5:使用Ajax和HTML5实现文件上传功能
WEB:文件上传 —— 看这篇就够了
HTML 表单最初只支持 application/x-www-form-urlencoded 形式编码(key=value&key=value...),但它不适合用于传输二进制数据(文件)或者包含非ASCII字符的数据。所以 multipart/form-data 就诞生了,专门用于传输文件。
WEBJ2EE
2019/07/30
6.7K0
WEB:文件上传 —— 看这篇就够了
Web开发中的文件上传组件uploadify的使用
在Web开发中,有很多可以上传的组件模块,利用HTML的File控件的上传也是一种办法,不过这种方式,需要处理的细节比较多,而且只能支持单文件的操作。在目前Web开发中用的比较多的,可能uploadify(参考http://www.uploadify.com/)也算一个吧,不过这个版本一直在变化,他们的脚本调用也有很大的不同,甚至调用及参数都一直在变化,很早的时候,那个Flash的按钮文字还没法变化,本篇随笔主要根据项目实际,介绍一下3.1版本的uploadify的控件使用,这版本目前还是最新的,因此对我们做Web开发来说,有一定的参考性。
小端
2019/01/30
1.4K0
WPF开发-网络请求
使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols。
码客说
2022/09/02
2.5K0
React 文件上传组件 File Upload
文件上传是现代 Web 应用中不可或缺的功能之一。无论是用户头像、文档附件还是多媒体文件,都需要一个高效且可靠的文件上传组件来处理。React 作为当前最流行的前端框架之一,提供了丰富的工具和库来简化文件上传的实现。本文将从基础开始,逐步深入介绍如何在 React 中实现文件上传组件,并探讨一些常见的问题、易错点及如何避免这些问题。
Jimaks
2024/12/03
4791
React 文件上传组件 File Upload
文件上传的最佳前端体验做法
网页开发者们想了很多办法,试图提升文件上传的功能和操作体验,在各种Javascript库的基础上,开发了五花八门的插件。可是,由于不同浏览器之间的差异,缺乏统一接口,这些插件要么用起来很麻烦,要么不能普遍适用。
javascript.shop
2019/09/05
1.8K0
文件上传的最佳前端体验做法
HTML5 File API 使用技巧
在 HTML5 的 input 标签中,新增了一个 type=file 属性的表单控件。这个控件可以让我们能调出文件选择窗口然后读取这些文件的内容成为可能。
多云转晴
2019/10/22
2.6K0
Angular2使用ng2-file-upload上传文件
Angular2中有两个比较好用的上传文件的第三方库,一个是ng2-file-upload,一个是ng2-uploader。ng2-uploader是一个轻便的上传文件的支持库,功能较弱,而ng2-file-upload是一个功能比较全面的上传文件的支持库。这里主要介绍一下ng2-file-upload的使用。
用户5640963
2019/07/25
1.6K0
文件上传杂谈
文件上传是前端很常见的一类场景。图片、视频和文档等等都属于文件范畴,每个文件则是通过 File.Type 进行更细的划分。本文将针对文件上传的一些通用维度场景做简单的剖析和尝试,抛砖引玉,希望共同学习,共同成长。
有赞coder
2021/01/18
1.6K0
文件上传杂谈
springMVC是实现前台带进度条文件上传
项目框架采用spring+hibernate+springMVC如果上传文件不想使用flash那么你可以采用html5;截图前段模块是bootstarp框架;不废话直接来代码;spring-mvc配置文件;效果截图如下:
用户6625441
2020/03/13
1.7K0
【php详细笔记】上传文件到服务器
QQ空间里面上传图片呀 微信朋友圈上传图片 发邮件里面上传邮件资料附件 认证的时候要求上传照片或身份证 还有各种产品汪(gou)们提出的需求来分析,上传不同的东西。
20岁爱吃必胜客
2022/11/13
9.7K0
【php详细笔记】上传文件到服务器
WebUploader文件上传插件
WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+。两套运行时,同样的调用方式,可供用户任意选用。
一觉睡到小时候
2019/07/04
3.8K3
React 文件上传组件 File Upload
文件上传是 Web 应用中常见的功能之一,无论是图片、文档还是其他类型的文件,都需要一个可靠的文件上传组件来实现这一功能。React 作为目前最流行的前端框架之一,提供了丰富的生态系统和工具来帮助开发者构建高效的文件上传组件。本文将从浅入深地介绍如何在 React 中实现文件上传组件,包括常见的问题、易错点以及如何避免这些问题。
Jimaks
2024/11/27
3330
.net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件
asp.net mvc请移步 mvc文件上传支持批量上传,拖拽以及预览,文件内容校验
FreeTimeWorker
2020/08/31
2.1K0
.net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件
相关推荐
ASP.NET Core文件上传与下载(多种上传方式)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验