使用 Web API 上傳和下載多個文件

原文作者:Jay Krishna Reddy

原文鏈接:https://www.c-sharpcorner.com/article/upload-and-download-multiple-files-using-web-api/

翻譯:沙漠盡頭的狼(谷歌翻譯加持,文中版本使用.NET 6升級)

---正文開始---

今天,我們將通過一個簡單的過程介紹使用 ASP.Net Core 6.0 Web API 上傳和下載多個文件。

步驟

首先在 Visual Studio 中創建一個空的 Web API 項目,目標框架選擇.Net 6.0

此項目中沒有使用外部包。

創建一個 Services 文件夾,并在其中創建一個 FileService 類和 IFileService 接口。

我們在這個 FileService.cs 中使用了三個方法

  • UploadFile

  • DownloadFile

  • SizeConverter

由于我們需要一個文件夾來存儲這些上傳文件,因此我們在這里添加了一個參數來將文件夾名稱作為字符串傳遞,它將存儲所有上傳的這些文件。

FileService.cs

using?System.IO.Compression;namespace?FileUploadAndDownload.Services;public?class?FileService?:?IFileService
{#region?Propertyprivate?readonly?IWebHostEnvironment?_webHostEnvironment;#endregion#region?Constructorpublic?FileService(IWebHostEnvironment?webHostEnvironment){_webHostEnvironment?=?webHostEnvironment;}#endregion#region?Upload?Filepublic?void?UploadFile(List<IFormFile>?files,?string?subDirectory){subDirectory?=?subDirectory????string.Empty;var?target?=?Path.Combine(_webHostEnvironment.ContentRootPath,?subDirectory);Directory.CreateDirectory(target);files.ForEach(async?file?=>{if?(file.Length?<=?0)?return;var?filePath?=?Path.Combine(target,?file.FileName);await?using?var?stream?=?new?FileStream(filePath,?FileMode.Create);await?file.CopyToAsync(stream);});}#endregion#region?Download?Filepublic?(string?fileType,?byte[]?archiveData,?string?archiveName)?DownloadFiles(string?subDirectory){var?zipName?=?$"archive-{DateTime.Now:yyyy_MM_dd-HH_mm_ss}.zip";var?files?=?Directory.GetFiles(Path.Combine(_webHostEnvironment.ContentRootPath,?subDirectory)).ToList();using?var?memoryStream?=?new?MemoryStream();using?(var?archive?=?new?ZipArchive(memoryStream,?ZipArchiveMode.Create,?true)){files.ForEach(file?=>{var?theFile?=?archive.CreateEntry(Path.GetFileName(file));using?var?binaryWriter?=?new?BinaryWriter(theFile.Open());binaryWriter.Write(File.ReadAllBytes(file));});}return?("application/zip",?memoryStream.ToArray(),?zipName);}#endregion#region?Size?Converterpublic?string?SizeConverter(long?bytes){var?fileSize?=?new?decimal(bytes);var?kilobyte?=?new?decimal(1024);var?megabyte?=?new?decimal(1024?*?1024);var?gigabyte?=?new?decimal(1024?*?1024?*?1024);return?fileSize?switch{_?when?fileSize?<?kilobyte?=>?"Less?then?1KB",_?when?fileSize?<?megabyte?=>$"{Math.Round(fileSize?/?kilobyte,?0,?MidpointRounding.AwayFromZero):##,###.##}KB",_?when?fileSize?<?gigabyte?=>$"{Math.Round(fileSize?/?megabyte,?2,?MidpointRounding.AwayFromZero):##,###.##}MB",_?when?fileSize?>=?gigabyte?=>$"{Math.Round(fileSize?/?gigabyte,?2,?MidpointRounding.AwayFromZero):##,###.##}GB",_?=>?"n/a"};}#endregion
}

SizeConverter 函數用于獲取我們上傳文件到服務器的實際大小。

IFileService.cs

namespace?FileUploadAndDownload.Services;public?interface?IFileService
{void?UploadFile(List<IFormFile>?files,?string?subDirectory);(string?fileType,?byte[]?archiveData,?string?archiveName)?DownloadFiles(string?subDirectory);string?SizeConverter(long?bytes);
}

讓我們在 Program.cs 文件中添加這個服務依賴項

Program.cs

using?FileUploadAndDownload.Services;var?builder?=?WebApplication.CreateBuilder(args);//?Add?services?to?the?container.builder.Services.AddControllers();
//?Learn?more?about?configuring?Swagger/OpenAPI?at?https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();//?主要是添加下面這句代碼,注入文件服務
builder.Services.AddTransient<IFileService,?FileService>();var?app?=?builder.Build();//?Configure?the?HTTP?request?pipeline.
if?(app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI();
}app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();

創建一個 FileController,并 FileController 中的構造函數注入 IFileService

FileController.cs

using?FileUploadAndDownload.Services;
using?Microsoft.AspNetCore.Mvc;
using?System.ComponentModel.DataAnnotations;namespace?FileUploadAndDownload.Controllers;[Route("api/[controller]")]
[ApiController]
public?class?FileController?:?ControllerBase
{private?readonly?IFileService?_fileService;public?FileController(IFileService?fileService){_fileService?=?fileService;}[HttpPost(nameof(Upload))]public?IActionResult?Upload([Required]?List<IFormFile>?formFiles,?[Required]?string?subDirectory){try{_fileService.UploadFile(formFiles,?subDirectory);return?Ok(new?{?formFiles.Count,?Size?=?_fileService.SizeConverter(formFiles.Sum(f?=>?f.Length))?});}catch?(Exception?ex){return?BadRequest(ex.Message);}}[HttpGet(nameof(Download))]public?IActionResult?Download([Required]?string?subDirectory){try{var?(fileType,?archiveData,?archiveName)?=?_fileService.DownloadFiles(subDirectory);return?File(archiveData,?fileType,?archiveName);}catch?(Exception?ex){return?BadRequest(ex.Message);}}
}

我們可以在 swaggerpostman 中測試我們的 API。

d1cd5743cd1e7ceeba6356b8055692f1.png

在這里,我們看到了我們創建的用于上傳和下載的兩個 API,因此讓我們分別測試它們中的每一個。

619b3c7520625f8fc0e902bba0cf92cd.png

subDirectory字段中 輸入文件保存的文件夾名稱,并在下面添加文件用于保存在服務器對應的子文件夾名稱下。作為響應,我們會看到文件的總數和所有上傳文件的總實際大小。

22f787eff3cdfb76de49124620c8ebfc.png

現在將檢查下載 API。由于我們的文件夾中有多個文件,它將作為Zip 文件下載,我們需要將其解壓縮以檢查文件。

e94e3d7131d2e4cf81a1b1747ac155e2.png

總結

使用Web API接口的方式上傳和下載文件,適用于Blazor Server、Blazor Client、MAUI、Winform、WPF等客戶端程序,后面有空寫寫客戶端怎么調用這些接口。

  • 本文源碼:FileUploadAndDownload[1]

.... 保持學習 !!!

參考資料

[1]

FileUploadAndDownload: https://github.com/dotnet9/ASP.NET-Core-Test/tree/master/src/FileUploadAndDownload

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284451.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284451.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284451.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

詳解T-SQL的聯接機制

T-SQL的聯接分三種類型&#xff1a; 交叉聯接 ( cross join ) 內部聯接 (inner join) 外部聯接 (outer join) 每種聯接在邏輯上經歷不同的階段&#xff0c;分為笛卡爾乘積、篩選、添加外部行&#xff0c;如圖&#xff1a; 聯接類型 階段 交叉聯接 笛卡兒乘積 內部聯接…

Android FrameWork學習(一)Android 7 0系統源碼下載 編譯

最近計劃著研究下 Android 7.0 的系統源碼&#xff0c;之前也沒做過什么記錄&#xff0c;這次正好將學習的內容記錄下來&#xff0c;方便以后復習鞏固。 既然要學習我們的系統源碼&#xff0c;那我們第一步要做的就是下載源碼并進行編譯了。 #硬件環境要求 ###1. 編譯環境 按照…

【MapGIS精品教程】002:GDB本地數據庫的使用

本文主要內容為MapGISGDB本地數據庫的使用&#xff0c;包括&#xff1a;GDB企業管理器的認識、GDB本地數據庫的創建方法、GDB本地數據庫的備份和恢復。 1. GDB企業管理器的認識 GDB是地理數據的資源管理器&#xff0c;主要對空間數據進行有序組織與管理。 GDB數據管理包括&…

RabbitMQ學習3----運行和管理RabbitMQ

1.服務為管理 Erlang天生就是為了讓應用程序無需知道對方是否存在同一臺機器上即可互相通信。 Erlang節點&#xff1a;Erlang虛擬機的每個實例。多個Erlang應用程序可以運行在同一個節點之上。節點之間可以進行本地通信&#xff08;不管他們是運行在同一臺服務器之上&#xff0…

各代移動網絡性能

摘自《中國元宇宙白皮書》 下載整書完整版https://www.aliyundrive.com/s/gXQvRLM22kD

EFCore高級Saas系統下單DbContext如何支持不同數據庫的遷移

前言隨著系統的不斷開發和迭代默認的efcore功能十分強大&#xff0c;但是隨著Saas系統的引進efcore基于表字段的多租戶模式已經非常完美了&#xff0c;但是基于數據庫的多租戶也是可以用的&#xff0c;但是也存在缺點&#xff0c;缺點就是沒有辦法支持不同數據庫&#xff0c;mi…

poj 1679: The Unique MST【次小生成樹】

題目鏈接 參考博客 希望注釋足夠清楚。。歡迎指出不足~ #include<cstdio> #include<cstring> #include<algorithm> using namespace std;const int maxn110; const int INF0x3f3f3f3f;int n,m; int mp[maxn][maxn]; int maxlen[maxn][maxn]; //maxlen…

51. Python 數據處理(2)

1.Python 修改excel文件import xlrd import xlutils.copy excelr xlrd.open_workbook("hello.xlsx") excelw xlutils.copy.copy(excelr) sheet1 excelw.get_sheet(0) sheet1.write(3, 5, "xlutils.copy test test") excelw.save("hello.xlsx"…

人工智能十大流行算法

導讀&#xff1a;本文為有志于成為數據科學家或對此感興趣的讀者們介紹最流行的機器學習算法。 作者&#xff1a;Fahim ul Haq 譯者&#xff1a;劉志勇&#xff0c;策劃&#xff1a;趙鈺瑩 來源&#xff1a;InfoQ&#xff08;ID&#xff1a;infoqchina&#xff09; 機器學習是…

Win7+Win10雙系統安裝全攻略

安裝雙系統,不僅能給你非凡的體驗,還可以滿足工作中因系統版本,兼容性,處理器等原因帶來的不便。本文講解Win7+Win10雙系統安裝全攻略,親測可用。 1. 硬盤分區 本文講解利用固態硬盤+機械硬盤的分區方式。 固態硬盤:為了絕對提高系統運行的速度,將固態硬盤作為雙系統的…

[矩形并-掃描線-線段樹]Picture

最近在補數學和幾何&#xff0c;沒啥好寫的&#xff0c;因為已經決定每天至少寫一篇了&#xff0c;今天隨便拿個題水水。 題目大意&#xff1a;給你N個邊平行于坐標軸的矩形&#xff0c;求它們并的周長。(N<5000) 思路&#xff1a;這個數據范圍瞎暴力就過了&#xff0c;但我…

聊聊研發團隊中的“人”

大家好&#xff0c;我是Z哥。漢字博大精深&#xff0c;很多時候我們可以通過拆字來更形象地理解一個詞的含義。比如“團隊”這個詞的兩個字"團"和“隊”單獨看也都是表示一種由多人組成的組織。再做一下拆字就是“口”“才”和“耳”“人”。前者表示一個人才如果沒有…

[轉]【分布式系統】唯一ID生成策略總結

文章目錄 全局唯一id介紹 全局唯一id特點:常見全局唯一id生成策略 1、數據庫自增長序列或字段生成id 2、UUID 3、Redis生成ID 4、zookeeper生成ID 5、Twitter的snowflake算法全局唯一id介紹 系統唯一id是我們在設計階段常常遇到的問題。在復雜的分布式系統中&#…

shell在一個大文件找出想要的一段字符串操作技巧

昨天端午&#xff0c;晚上的時候接了一個電話&#xff0c;我朋友的公司&#xff0c;數據庫被兩個工作沒多久的phper給弄壞了&#xff0c;具體就是把一個字段值&#xff0c;給全表弄成一個了名字了&#xff0c;當然這個是可以配置了禁止全表更新數據庫,這下可急壞了&#xff0c;…

CentOS7安裝EPEL源

CentOS7安裝EPEL [lijiayuncentos-*** ~]$ yum install epel-release已加載插件&#xff1a;fastestmirror, langpacks您需要 root 權限執行此命令。[lijiayuncentos-*** ~]$ su密碼&#xff1a;[rootcentos-*** lijiayun]# yum install epel-release已加載插件&#xff1a;fas…

超全的開源Winform UI庫,滿足你的一切桌面開發需求!

本文有dotnet9站長整理 網址&#xff1a;https://dotnet9.com/本站曾介紹過一款Winform開源控件庫HZHControls&#xff0c;Winform在大家心中的地位還是挺高的&#xff0c;今天小編再分享一款新鮮出爐的 Winform UI庫——SunnyUI&#xff0c;一起跟 Dotnet9 往下看吧。項目名稱…

告別國外 IDE,阿里 螞蟻自研 IDE 研發框架 OpenSumi 正式開源

經歷近 3 年時間&#xff0c;在阿里集團及螞蟻集團共建小組的努力下&#xff0c;OpenSumi 作為國內首個強定制性、高性能&#xff0c;兼容 VS Code 插件體系的 IDE 研發框架&#xff0c;今天正式對外開源。 一 OpenSumi 是什么&#xff1f; OpenSumi 是一款面向垂直領域&#…

window-memcache技術隨筆

memcached.exe軟件放置到非中文,非空格的目錄,把MSVCR71.DLL文件放在memcached.exe同目錄下啟動,控制面板中打開window功能-Telnet客戶端memcache服務方法一:管理員身份打開黑窗口 d:(mem的所在盤)cd memmemcached.exe -p 11211方法二: 安裝為Windows的系統服務memcached.exe -…

將不確定變為確定~老趙寫的CodeTimer是代碼性能測試的利器

首先&#xff0c;非常感謝趙老大的CodeTimer&#xff0c;它讓我們更好的了解到代碼執行的性能&#xff0c;從而可以讓我們從性能的角度來考慮問題&#xff0c;有些東西可能我們認為是這樣的&#xff0c;但經理測試并非如何&#xff0c;這正應了我之前的那名話&#xff1a;“機器…

聊聊 C++ 中的幾種智能指針(下)

一&#xff1a;背景 上一篇我們聊到了C 的 auto_ptr &#xff0c;有朋友說已經在 C 17 中被棄用了&#xff0c;感謝朋友提醒&#xff0c;今天我們來聊一下 C 11 中引入的幾個智能指針。unique_ptrshared_ptrweak_ptr看看它們都怎么玩。二&#xff1a;三大智能指針詳解 1. uniq…