.net Core 上傳文件詳解

.net core 和.net framework上傳文件有很多需要注意的地方
.net framework 上傳文件用httppostedfilebase
.net core 上傳文件用 IFormFile

一、首先需要配置在startup 中的Configure方法內新增以下程式碼
app.UseStaticFiles();
而配置Apk下載需要加以下程式碼,與上面的app.UseStaticFiles()並不衝突

 app.UseStaticFiles(new StaticFileOptions
            {
                //FileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory()),
                //設置不限制content-type 該設置可以下載所有類型的文件,但是不建議這麼設置,因為不安全
                //下面設置可以下載apk和nupkg類型的文件
                ContentTypeProvider = new FileExtensionContentTypeProvider(new Dictionary<string, string>
                {
                      { ".apk", "application/vnd.android.package-archive" }
                })
            });

如下圖:

如果被限制上傳大小,需要在startup 中的ConfigureServices新增如下程式碼:

   services.Configure<FormOptions>(x =>
            {
                x.MultipartBodyLengthLimit = int.MaxValue;
            });

如下圖:

二、上傳文件到wwwroot/虛擬目錄中,需要在項目內新增一個文件夾,更名為wwwroot
如下圖:

三、控制器(UploadController)需要注入IWebHostEnvironment

        private readonly IWebHostEnvironment _env;
        public UploadController(IWebHostEnvironment env)
        {
            _env = env;
        }

如下圖:

四、需要在控制器方法配置 [RequestSizeLimit(int.MaxValue)] 上傳文件大小限制改為最大值,附上傳文件程式碼

/// <summary>
        /// 上傳包文件
        /// </summary>
        /// <param name="files">文件</param>
        /// <param name="VersionCode">版本程式碼</param>
        /// <param name="Creator">上傳人</param>
        /// <returns></returns>
        [HttpPost("UploadPackage")]
        [RequestSizeLimit(int.MaxValue)]
        public async Task<ApiResult> UploadPackage([FromForm(Name = "files")] List<IFormFile> files,
       [FromForm] string VersionCode, [FromForm] string Creator)
        {
            string FileTime = DateTime.Now.ToString("yyyyMMdd");
            string uploadPath = Path.Combine(_env.WebRootPath, "CommonUpLoadFile", FileTime);//上傳路徑;虛擬目錄wwwroot\CommonUpLoadFile\..
            try
            {
                string fileName = string.Empty;
                string QueryPath = string.Empty;
                foreach (var formFile in files)
                {
                    if (formFile.Length > 0)
                    {
                        if (!Directory.Exists(uploadPath)) //不存在則創建路徑
                        {
                            Directory.CreateDirectory(uploadPath);  
                        }
                        fileName = formFile.FileName;
                        string savePath = Path.Combine(uploadPath, fileName);//保存文件
                        QueryPath = $"{CU_server.UploadQuery_String}CommonUpLoadFile/{FileTime}/{fileName}";//查詢的文件名;CU_server.UploadQuery_String指向虛擬目錄wwwroot
                        using (var stream = System.IO.File.Create(savePath))
                        {
                            await formFile.CopyToAsync(stream);
                        }
                    }
                }
                return OkResult("上傳成功");
            }
            catch (Exception ex)
            {
                return MessageResult(404, $"上傳出現錯誤,錯誤原因:{ex.Message}");
            }
        }

如圖:

註:附上官方 .NET Core 上傳文件文檔

PostMan測試截圖

歡迎各位大神指點,有用就點個贊吧!