asp.net6 blazor 文件上传
微软在asp.net6中给blazor新增了一个IJSStreamReference的接口。
我们今天的所有内容,都要依赖这个接口,因为它可以把流直接传到c#中,这样我们就可以做很多的骚操作了。
今天我们来做一个简单的文件上传,这里以bootstrapblazor中新的CherryMarkdown组件为例。
首先,CherryMarkdown本身就支持文件上传处理,所以我们可以直接拿到js中的file,这里就不用考虑获取文件的方式了。
这里我们直接用window来保存这个file对象,这样操作应该是最简单的。
fileUpload(file, callback) {
window.files = {};
window.files[0] = file;
obj.invokeMethodAsync('Upload', {
fileName: file.name,
fileSize: file.size,
contentType: file.type,
lastModified: new Date(file.lastModified).toISOString(),
}).then(data => {
if (data !== "") {
callback(data);
}
})
},
这里我们定义了window.files[0]为我们要上传的文件内容。
然后再写一个方法来返回这个window.files[0]。
export function bb_cherry_markdown_file(){
return window.files[0];
}
这样,我们的js部分就搞定了,无需webapi,也无需其他的支持。
下面我们来看c#部分,也是相当简单。
首先我们写一个Upload方法来接收文件上传的请求。
/// <summary>
/// 文件上传回调
/// </summary>
/// <param name="uploadFile"></param>
[JSInvokable]
public async Task<string> Upload(CherryMarkdownUploadFile uploadFile)
{
var stream = await Module.InvokeAsync<IJSStreamReference>("bb_cherry_markdown_file");
var data = await stream.OpenReadStreamAsync();
uploadFile.UploadStream = data;
if (OnFileUpload == null)
{
return "";
}
return await OnFileUpload.Invoke(uploadFile);
}
这里的CherryMarkdownUploadFile如下:
/// <summary>
/// 文件信息
/// </summary>
public class CherryMarkdownUploadFile
{
/// <summary>
/// 文件名
/// </summary>
public string? FileName { get; set; }
/// <summary>
/// 文件大小
/// </summary>
public long FileSize { get; set; }
/// <summary>
/// 最后修改日期
/// </summary>
public string? LastModified { get; set; }
/// <summary>
/// 文件类型
/// </summary>
public string? ContentType { get; set; }
/// <summary>
/// 上传的文件流
/// </summary>
public Stream? UploadStream { get; set; }
/// <summary>
/// 返回码,0为成功,非0失败
/// </summary>
public int Code { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public string? Error { get; set; }
/// <summary>
/// 保存到文件
/// </summary>
/// <param name="fileName"></param>
/// <param name="token"></param>
/// <returns></returns>
public async Task<bool> SaveToFile(string fileName, CancellationToken token = default)
{
var ret = false;
if (UploadStream != null)
{
// 文件保护,如果文件存在则先删除
if (System.IO.File.Exists(fileName))
{
try
{
System.IO.File.Delete(fileName);
}
catch (Exception ex)
{
Code = 1002;
Error = ex.Message;
}
}
var folder = Path.GetDirectoryName(fileName);
if (!string.IsNullOrEmpty(folder) && !Directory.Exists(folder))
{
Directory.CreateDirectory(folder);
}
if (Code == 0)
{
using var uploadFile = File.OpenWrite(fileName);
try
{
// 打开文件流
var stream = UploadStream;
var buffer = new byte[4 * 1096];
int bytesRead = 0;
// 开始读取文件
while ((bytesRead = await stream.ReadAsync(buffer, token)) > 0)
{
await uploadFile.WriteAsync(buffer.AsMemory(0, bytesRead), token);
}
ret = true;
}
catch (Exception ex)
{
Code = 1003;
Error = ex.Message;
}
}
}
return ret;
}
}
可以用来接收js中的
obj.invokeMethodAsync('Upload', {
fileName: file.name,
fileSize: file.size,
contentType: file.type,
lastModified: new Date(file.lastModified).toISOString(),
}).then(data => {
if (data !== "") {
callback(data);
}
})
并且有一个SaveToFile方法可以将流保存为文件。
然后就是最关键的这行代码:
var stream = await Module.InvokeAsync<IJSStreamReference>("bb_cherry_markdown_file");
我们调用刚刚js中的bb_cherry_markdown_file方法来获取浏览器中的window.files[0],就可以返回一个stream,然后我们就可以结合CherryMarkdownUploadFile来将文件保存。
asp.net6 blazor 文件上传的更多相关文章
- ASP.NET多文件上传实例
在Web应用程序开发中,避免不了要用到上传文件这个功能,但以前上传文件是个很麻烦的事,现在有了.NET,文件上传变得轻而易举.下面的这个例子实现了多文件上传功能.可以动态添加输入表单,上传的文件数量没 ...
- ASP.NET - 多文件上传,纯代码,不使用插件
解决方案: 前段代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Mu ...
- ASP.NET MVC 文件上传和路径处理
ASP.NET MVC 文件上传和路径处理总结 目录 文件的上传和路径处理必须解决下面列出的实际问题: 1.重复文件处理 2.单独文件上传 3.编辑器中文件上传 4.处理文章中的图片路径 5.处理上传 ...
- 使用NeatUpload控件实现ASP.NET大文件上传
使用NeatUpload控件实现ASP.NET大文件上传 一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不 ...
- ASP.NET MVC文件上传【转】
最近用到了文件上传功能,下面给出ASP.NET MVC文件上传的一个简单示例: 一.前端代码 @using (Html.BeginForm("UploadFile", " ...
- [转载]ASP.NET Core文件上传与下载(多种上传方式)
ASP.NET Core文件上传与下载(多种上传方式) 前言 前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了. 打算写个系列,但是还没想好目录,今天先来一篇,后面在 ...
- ASP.NET Core文件上传IFormFile于Request.Body的羁绊
前言 在上篇文章深入探究ASP.NET Core读取Request.Body的正确方式中我们探讨了很多人在日常开发中经常遇到的也是最基础的问题,那就是关于Request.Body的读取方式问题,看是简 ...
- ASP.NET Core 文件上传
前言 上篇博文介绍了怎么样在 asp.net core 使用 Redis 和 Protobuf 进行 Session缓存.本篇的是开发过程中使用的一个小功能,怎么做单文件和多文件上传. 如果你觉得对你 ...
- ASP.NET 大文件上传的简单处理
在 ASP.NET 开发的过程中,文件上传往往使用自带的 FileUpload 控件,可是用过的人都知道,这个控件的局限性十分大,最大的问题就在于上传大文件时让开发者尤为的头疼,而且,上传时无法方便的 ...
随机推荐
- 如何0代码实现多人音视频通话?【内附源码/Demo】
3月15日新增"1860+1194",全国进入了抗疫关键时期.响应政策多地采取了社会面清零策略. 3月14日零点,深圳按下了暂停键. 应疫情防控要求,深圳全市暂停生产经营活动,严格 ...
- 【网易云信】H5 容器技术方案
Native 开发原生应用是手机操作系统厂商(目前主要是苹果的 iOS 和 Google 的 Android)对外界提供的标准化的开发模式,他们对于 Native 开发提供了一套标准化实现和优化方案. ...
- 设计模式之:抽象工厂模式AbstractFactoryPattern的实现
相比于工厂模式,抽象工厂模式的每个工厂可以创建产品系列,而不是一个产品: 抽象工厂用到的技术:接口.多态.配置文件.反射: 抽象工厂模式的设计原则: 实现客户端创建产品和使用产品的分离,客户端无须了解 ...
- 惠普电脑win10系统中WLAN不见了
原文链接:笔记本电脑win10系统中WLAN不见了 怎么解决? - 知乎 (zhihu.com)
- nmtui 工具使用的话,需要开启NetworkManager(网卡文件不存在ens192)
环境采样: [root@k3master network-scripts]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) ...
- 时间篇之centos7修复ntpq: read: Connection refused
关于ntp同步时间, 由于是解决问题,所以理论性内容不多. 关于UTC NTP要提供准确的时间,就必须有准确的时间来源,那可以用格林尼治时间吗?答案是否定的. 因为格林尼治时间是以地球自转为基础的时间 ...
- 在定义C++, C通用接口函数时让C++接口支持默认参数
在SOUI4的开发中,所有SOUI核心对象都采用了一种类似COM接口的技术来导出接口. 这所以采用这种方案,主要目的是为了让SOUI4支持C语言调用,扩展SOUI的使用场景. 众所周知,C++函数的参 ...
- VirtualBox安装Kali
VirtualBox安装Kali 下载VBox 去Virtual Box官网下载(根据操作系统选择版本,此处以Windows为例) 打开安装程序进行安装即可 安装Kali 去Kali Linux官网下 ...
- SimpleDateFormat类的安全问题,这6个方案总有一个适合你
摘要:你使用的SimpleDateFormat类还安全吗?为什么说SimpleDateFormat类不是线程安全的?带着问题从本文中寻求答案. 本文分享自华为云社区<[高并发]SimpleDat ...
- 【GPLT】 图着色问题(c++)
题目如下: 这道题就是奇葩,多少有点低质量,这题不难,知识点就是邻接矩阵,但有以下奇葩点 1.颜色的编号是1-v 不是1-k,这点卡了我一会: 2.颜色涂色可以多于3,也可以少于3(这其实正常,但如果 ...