基於.NET6平台開發WebApi(十二)—— 添加文件上傳下載功能


基於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類型添加到項目中

再次嘗試發現文件已經可以正常下載。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM