基於NET6平台WebApi嘗鮮項目: 基於最新的.NET6平台,完全拋棄繁雜的接口,采用.NET最經典的三層架構,結合簡化的DDD設計模式... (gitee.com)
本篇為大家介紹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類型添加到項目中
再次嘗試發現文件已經可以正常下載。