微软在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 文件上传的更多相关文章

  1. ASP.NET多文件上传实例

    在Web应用程序开发中,避免不了要用到上传文件这个功能,但以前上传文件是个很麻烦的事,现在有了.NET,文件上传变得轻而易举.下面的这个例子实现了多文件上传功能.可以动态添加输入表单,上传的文件数量没 ...

  2. ASP.NET - 多文件上传,纯代码,不使用插件

    解决方案: 前段代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Mu ...

  3. ASP.NET MVC 文件上传和路径处理

    ASP.NET MVC 文件上传和路径处理总结 目录 文件的上传和路径处理必须解决下面列出的实际问题: 1.重复文件处理 2.单独文件上传 3.编辑器中文件上传 4.处理文章中的图片路径 5.处理上传 ...

  4. 使用NeatUpload控件实现ASP.NET大文件上传

    使用NeatUpload控件实现ASP.NET大文件上传 一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不 ...

  5. ASP.NET MVC文件上传【转】

    最近用到了文件上传功能,下面给出ASP.NET MVC文件上传的一个简单示例: 一.前端代码 @using (Html.BeginForm("UploadFile", " ...

  6. [转载]ASP.NET Core文件上传与下载(多种上传方式)

    ASP.NET Core文件上传与下载(多种上传方式)   前言 前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了. 打算写个系列,但是还没想好目录,今天先来一篇,后面在 ...

  7. ASP.NET Core文件上传IFormFile于Request.Body的羁绊

    前言 在上篇文章深入探究ASP.NET Core读取Request.Body的正确方式中我们探讨了很多人在日常开发中经常遇到的也是最基础的问题,那就是关于Request.Body的读取方式问题,看是简 ...

  8. ASP.NET Core 文件上传

    前言 上篇博文介绍了怎么样在 asp.net core 使用 Redis 和 Protobuf 进行 Session缓存.本篇的是开发过程中使用的一个小功能,怎么做单文件和多文件上传. 如果你觉得对你 ...

  9. ASP.NET 大文件上传的简单处理

    在 ASP.NET 开发的过程中,文件上传往往使用自带的 FileUpload 控件,可是用过的人都知道,这个控件的局限性十分大,最大的问题就在于上传大文件时让开发者尤为的头疼,而且,上传时无法方便的 ...

随机推荐

  1. 一个看一次就永远不会忘的windows环境开发小技巧

    前言:本人前端开发,在日常开发中需要打开多个窗口进行开发,如:本地服务窗口,ide工具,设计图,prd文档,浏览器,浏览器调试工具: 如此多的窗口同时打开并且时常需要查看的情况下,遗憾的是,即使我是双 ...

  2. Linux 0.11源码阅读笔记-高速缓冲

    高速缓冲 概念 高速缓冲区是内存中的一块内存,在块设备与内核其它程序之间起着一个桥梁作用.内核程序如果需要访问块设备中的数据,都需要经过高速缓冲区来间接的操作. 高速缓冲区结构 高速缓冲区被划分为1k ...

  3. java基础-多线程线程池

    线程池 * 程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互.而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池.线程池里的每一个线程代 ...

  4. uni-app 解析后台接口返回的HTML

    正常使用rich-text是可以解决问题的,但是在支付宝小程序中不显示,在文档中看到" 支付宝小程序 nodes 属性只支持使用 Array 类型.如果需要支持 HTML String,则需 ...

  5. Jenkins 脚本命令行应用总结

    Jenkins脚本命令行应用总结 测试环境 Jenkins 2.304 脚本命令行入口 Jenkins主页→系统管理→脚本命令行 遍历项目 例子:获取所有自由风格项目及相关项目信息 def proje ...

  6. Spring Boot之注册servlet三大组件

    由于Spring Boot默认是以jar包的形式启动嵌入式的Servlet容器来启动Spring Boot的web应用是,没有web.xml配置文件 注册三大组件用以下方式 ServletRegist ...

  7. 百度离线人脸识别sdk的使用

    1.1下载sdk运行 百度离线人脸识别sdk的使用 1.2配置环境 添加至项目,可以拖动复制或者以类库形式添加face-resource此文件夹 放到根目录上一层 激活文件与所有dll引用放到根目录嫌 ...

  8. 腾讯云OCR服务二次开发

    本文记录了对腾讯云OCR服务二次开发的代码和开发过程中遇到的问题.

  9. JavaScript学习总结7-BOM

    今天学习了BOM模型,可以利用其来获得屏幕数据,网页历史,以及网页location等数据

  10. Blazor WebAssembly 渐进式 Web 应用程序 (PWA) 使用 LocalStorage 离线处理数据

    原文链接:https://www.cnblogs.com/densen2014/p/16133343.html Window.localStorage 只读的localStorage 属性允许你访问一 ...