1. 程式人生 > 其它 >基於.NET6平臺開發WebApi(十二)—— 新增檔案上傳下載功能

基於.NET6平臺開發WebApi(十二)—— 新增檔案上傳下載功能

本篇為大家介紹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