1. 程式人生 > 程式設計 >ASP.NET Core單檔案和多檔案上傳並儲存到服務端的方法

ASP.NET Core單檔案和多檔案上傳並儲存到服務端的方法

前言:

  在我們日常開發中,關於圖片,視訊,音訊,文件等相關檔案上傳並儲存到服務端中是非常常見的一個功能,今天主要是把自己在開發中常用的兩種方式記錄下來方便一下直接使用,並且希望能夠幫助到有需要的同學!

一、配置ASP.NET Core中的靜態檔案:

簡單概述:

  在ASP.NET Core應用中靜態資原始檔需要進行相應的配置才能夠提供給客戶端直接使用。

詳情描述請參考官方文件:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/static-files?view=aspnetcore-3.1

簡單配置,提供 Web 根目錄內的檔案:

呼叫 Startup.Configure中的UseStaticFiles 方法配置:

public void Configure(IApplicationBuilder app)
{
  app.UseStaticFiles();
}

二、檔案伺服器和應用程式配置(IIS,Kestrel):

詳情描述,請參考官方文件說明:
https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1#server-and-app-configuration

多部分正文長度限制:

MultipartBodyLengthLimit 設定每個多部分正文的長度限制。 分析超出此限制的窗體部分時,會引發 InvalidDataException。 預設值為 134,217,728 (128 MB)。 使用 MultipartBodyLengthLimit 中的 Startup.ConfigureServices 設定自定義此限制:

public void ConfigureServices(IServiceCollection services)
{
  services.Configure<FormOptions>(options =>
  {
    // Set the limit to 256 MB
    options.MultipartBodyLengthLimit = 268435456;
  });
}

Kestrel 最大請求正文大小:

對於 Kestrel 託管的應用,預設的最大請求正文大小為 30,000,000 個位元組,約為 28.6 MB。 使用 MaxRequestBodySize Kestrel 伺服器選項自定義限制:

public static IHostBuilder CreateHostBuilder(string[] args) =>
  Host.CreateDefaultBuilder(args)
    .ConfigureKestrel((context,options) =>
    {
      // Handle requests up to 50 MB
      options.Limits.MaxRequestBodySize = 52428800;
    })
    .ConfigureWebHostDefaults(webBuilder =>
    {
      webBuilder.UseStartup<Startup>();
    });

IIS 內容長度限制:

預設的請求限制 (maxAllowedContentLength) 為 30,000 位元組,大約 28.6 MB。 請在 web.config 檔案中自定義此限制:

<system.webServer>
 <security>
  <requestFiltering>
   <!-- Handle requests up to 50 MB -->
   <requestLimits maxAllowedContentLength="52428800" />
  </requestFiltering>
 </security>
</system.webServer>

三、單檔案上傳:

using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;

namespace FileUploadManage.Controllers
{
  /// <summary>
  /// 圖片,視訊,音訊,文件等相關檔案通用上傳服務類
  /// </summary>
  public class FileUploadController : Controller
  {
    private static IHostingEnvironment _hostingEnvironment;

    public FileUploadController(IHostingEnvironment hostingEnvironment)
    {
      _hostingEnvironment = hostingEnvironment;
    }

    /// <summary>
    /// 單檔案上傳
    /// </summary>
    /// <returns></returns>
    public JsonResult SingleFileUpload()
    {
      var formFile = Request.Form.Files[0];//獲取請求傳送過來的檔案
      var currentDate = DateTime.Now;
      var webRootPath = _hostingEnvironment.WebRootPath;//>>>相當於HttpContext.Current.Server.MapPath("") 

      try
      {
        var filePath = $"/UploadFile/{currentDate:yyyyMMdd}/";

        //建立每日儲存資料夾
        if (!Directory.Exists(webRootPath + filePath))
        {
          Directory.CreateDirectory(webRootPath + filePath);
        }

        if (formFile != null)
        {
          //檔案字尾
          var fileExtension = Path.GetExtension(formFile.FileName);//獲取檔案格式,拓展名

          //判斷檔案大小
          var fileSize = formFile.Length;

          if (fileSize > 1024 * 1024 * 10) //10M TODO:(1mb=1024X1024b)
          {
            return new JsonResult(new { isSuccess = false,resultMsg = "上傳的檔案不能大於10M" });
          }

          //儲存的檔名稱(以名稱和儲存時間命名)
          var saveName = formFile.FileName.Substring(0,formFile.FileName.LastIndexOf('.'))+"_"+currentDate.ToString("HHmmss")+ fileExtension;

          //檔案儲存
          using (var fs = System.IO.File.Create(webRootPath + filePath + saveName))
          {
            formFile.CopyTo(fs);
            fs.Flush();
          }

          //完整的檔案路徑
          var completeFilePath = Path.Combine(filePath,saveName);

          return new JsonResult(new { isSuccess = true,returnMsg = "上傳成功",completeFilePath = completeFilePath });
        }
        else
        {
          return new JsonResult(new { isSuccess = false,resultMsg = "上傳失敗,未檢測上傳的檔案資訊~" });
        }

      }
      catch (Exception ex)
      {
        return new JsonResult(new { isSuccess = false,resultMsg = "檔案儲存失敗,異常資訊為:" + ex.Message });
      }
    }

  }
}

四、多檔案上傳:

using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Internal;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore.Internal;

namespace FileUploadManage.Controllers
{
  /// <summary>
  /// 圖片,視訊,音訊,文件等相關檔案通用上傳服務類
  /// </summary>
  public class FileUploadController : Controller
  {
    private static IHostingEnvironment _hostingEnvironment;

    public FileUploadController(IHostingEnvironment hostingEnvironment)
    {
      _hostingEnvironment = hostingEnvironment;
    }

    /// <summary>
    /// 多檔案上傳
    /// </summary>
    /// <param name="formCollection">表單集合值</param>
    /// <returns>伺服器儲存的檔案資訊</returns>

    public JsonResult MultiFileUpload(IFormCollection formCollection)
    {
      var currentDate = DateTime.Now;
      var webRootPath = _hostingEnvironment.WebRootPath;//>>>相當於HttpContext.Current.Server.MapPath("") 
      var uploadFileRequestList = new List<UploadFileRequest>();
      try
      {
        //FormCollection轉化為FormFileCollection
        var files = (FormFileCollection)formCollection.Files;

        if (files.Any())
        {
          foreach (var file in files)
          {
            var uploadFileRequest = new UploadFileRequest();

            var filePath = $"/UploadFile/{currentDate:yyyyMMdd}/";

            //建立每日儲存資料夾
            if (!Directory.Exists(webRootPath + filePath))
            {
              Directory.CreateDirectory(webRootPath + filePath);
            }

            //檔案字尾
            var fileExtension = Path.GetExtension(file.FileName);//獲取檔案格式,拓展名

            //判斷檔案大小
            var fileSize = file.Length;

            if (fileSize > 1024 * 1024 * 10) //10M TODO:(1mb=1024X1024b)
            {
              continue;
            }

            //儲存的檔名稱(以名稱和儲存時間命名)
            var saveName = file.FileName.Substring(0,file.FileName.LastIndexOf('.')) + "_" + currentDate.ToString("HHmmss") + fileExtension;

            //檔案儲存
            using (var fs = System.IO.File.Create(webRootPath + filePath + saveName))
            {
              file.CopyTo(fs);
              fs.Flush();
            }

            //完整的檔案路徑
            var completeFilePath = Path.Combine(filePath,saveName);

            uploadFileRequestList.Add(new UploadFileRequest()
            {
              FileName = saveName,FilePath = completeFilePath
            });
          }
        }
        else
        {
          return new JsonResult(new { isSuccess = false,resultMsg = "上傳失敗,未檢測上傳的檔案資訊~" });
        }
      }
      catch (Exception ex)
      {
        return new JsonResult(new { isSuccess = false,resultMsg = "檔案儲存失敗,異常資訊為:" + ex.Message });
      }

      if (uploadFileRequestList.Any())
      {
        return new JsonResult(new { isSuccess = true,filePathArray = uploadFileRequestList });
      }
      else
      {
        return new JsonResult(new { isSuccess = false,resultMsg = "網路打瞌睡了,檔案儲存失敗" });
      }
    }

  }

  /// <summary>
  /// 對檔案上傳響應模型
  /// </summary>
  public class UploadFileRequest
  {
    /// <summary>
    /// 檔名稱
    /// </summary>
    public string FileName { get; set; }

    /// <summary>
    /// 檔案路徑
    /// </summary>
    public string FilePath { get; set; }
  }
}

到此這篇關於ASP.NET Core單檔案和多檔案上傳並儲存到服務端的方法的文章就介紹到這了,更多相關ASP.NET Core檔案上傳內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!

作者:追逐時光

作者簡介:一個熱愛程式設計,善於分享,喜歡學習、探索、嘗試新事物,新技術的程式猿。