網站首頁 編程語言 正文
微軟在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
來將文件保存。
原文鏈接:https://www.cnblogs.com/j4587698/p/16301706.html
相關推薦
- 2022-03-08 Qt?儀表盤的實現示例_C 語言
- 2022-10-20 C#?Winform消息通知系統托盤氣泡提示框ToolTip控件_C#教程
- 2022-05-28 關于docker?compose安裝redis集群的問題(集群擴容、集群收縮)_docker
- 2022-09-30 Flutter?日歷組件簡單實現_Android
- 2022-01-16 對npm模塊進行調試和測試——npm link
- 2022-11-05 Nginx配置文件中location配置的多種場景_nginx
- 2022-07-30 Linux下查看文件和文件夾大小
- 2022-09-14 jQuery實現簡單計算器_jquery
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支