基於.NET6平臺開發WebApi(十二)—— 新增檔案上傳下載功能
阿新 • • 發佈:2022-01-08
本篇為大家介紹WebApi又一個必不可少的功能,那就是檔案上傳下載。
還記得我們在初期改造專案的時候刪掉的wwwroot資料夾嗎,這裡放的就是專案中的靜態資原始檔,接下來我們來手動實現這個功能。
1、我們為專案新增一個靜態的工具類,命名為CommonFun,並新增如下程式碼(以後你所有的靜態擴充套件方法都可以放到這裡)
using System.Text; namespace NET6.Infrastructure.Tools { /// <summary> /// 工具類 /// </summary> public static class CommonFun {#region 檔案操作 public static FileInfo[] GetFiles(string directoryPath) { if (!IsExistDirectory(directoryPath)) { throw new DirectoryNotFoundException(); } var root = new DirectoryInfo(directoryPath); return root.GetFiles(); }public static bool IsExistDirectory(string directoryPath) { return Directory.Exists(directoryPath); } public static string ReadFile(string Path) { string s; if (!File.Exists(Path)) s = "不存在相應的目錄"; else {var f2 = new StreamReader(Path, Encoding.Default); s = f2.ReadToEnd(); f2.Close(); f2.Dispose(); } return s; } public static void FileMove(string OrignFile, string NewFile) { File.Move(OrignFile, NewFile); } public static void CreateDir(string dir) { if (dir.Length == 0) return; if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); } #endregion } }
2、開啟Program.cs,新增如下程式碼
#region 啟用靜態資源訪問 //建立目錄 var path = Path.Combine(basePath, "Files/"); CommonFun.CreateDir(path); app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(path), RequestPath = "/Files" }); #endregion
至此我們就在專案中建立了Files資料夾,並且啟用了靜態檔案訪問功能。
3、接下來我們新建一個控制器,命名為UploadController,並新增如下程式碼
using Microsoft.AspNetCore.Mvc; using NET6.Infrastructure.Tools; namespace NET6.Api.Controllers { /// <summary> /// 檔案上傳 /// </summary> [Route("upload")] public class UploadController : BaseController { readonly IConfiguration _config; readonly IWebHostEnvironment _env; public UploadController(IConfiguration config, IWebHostEnvironment env) { _config = config; _env = env; } /// <summary> /// 上傳檔案 /// </summary> /// <param name="path">檔案分類的資料夾名稱</param> /// <returns></returns> [HttpPost("file")] public async Task<IActionResult> FileUpload(string path = "default") { var files = Request.Form.Files; if (files.Count == 0) return Ok(JsonView("請選擇檔案")); var domain = _config["Domain"]; var dircstr = $"/Files/{path}/{DateTime.Now:yyyyMMdd}/"; var result = new List<string>(); foreach (var file in files) { var filename = Path.GetFileName(file.FileName); if (filename.IsNull()) continue; var fileext = Path.GetExtension(filename).ToLower(); var folderpath = _env.ContentRootPath; CommonFun.CreateDir(folderpath + dircstr); //重新命名檔案 var pre = DateTime.Now.ToString("yyyyMMddHHmmssffff"); var after = CommonFun.GetRandom(1000, 9999).ToString(); var fileloadname = dircstr + pre + "_" + after + ProExt(fileext); using (var stream = new FileStream(folderpath + fileloadname, FileMode.Create)) { await file.CopyToAsync(stream); } result.Add(domain + fileloadname); } return Ok(JsonView(result)); } #region 校驗檔案型別 string[] badext = { "exe", "msi", "bat", "com", "sys", "aspx", "asax", "ashx" }; private string ProExt(string ext) { if (ext.IsNull()) return ""; if (badext.Contains(ext)) throw new Exception("危險檔案"); if (ext.First() == '.') return ext; return "." + ext; } #endregion } }
至此,我們的檔案上傳功能便已經開發完成。
聰明的你會發現對於某些特殊檔案會出現無法下載的情況,原因是特殊檔案需要手動啟用MIME支援。
4、我們開啟Program.cs,改造一下程式碼,將我們需要的MIME型別新增到專案中
再次嘗試發現檔案已經可以正常下載。
本文來自部落格園,作者:昨夜丶雨疏風驟,轉載請註明原文連結:https://www.cnblogs.com/netsix/p/15777534.html