ASP.NET Core單文件和多文件上傳并保存到服務端的方法
前言:
在我們日常開發(fā)中,關于圖片,視頻,音頻,文檔等相關文件上傳并保存到服務端中是非常常見的一個功能,今天主要是把自己在開發(fā)中常用的兩種方式記錄下來方便一下直接使用,并且希望能夠幫助到有需要的同學!
一、配置ASP.NET Core中的靜態(tài)文件:
簡單概述:
在ASP.NET Core應用中靜態(tài)資源文件需要進行相應的配置才能夠提供給客戶端直接使用。
詳情描述請參考官方文檔:
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 設置每個多部分正文的長度限制。 分析超出此限制的窗體部分時,會引發(fā) 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 個字節(jié),約為 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,000 字節(jié),大約 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];//獲取請求發(fā)送過來的文件
var currentDate = DateTime.Now;
var webRootPath = _hostingEnvironment.WebRootPath;//>>>相當于HttpContext.Current.Server.MapPath("")
try
{
var filePath = $"/UploadFile/{currentDate:yyyyMMdd}/";
//創(chuàng)建每日存儲文件夾
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}/";
//創(chuàng)建每日存儲文件夾
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, returnMsg = "上傳成功", filePathArray = uploadFileRequestList });
}
else
{
return new JsonResult(new { isSuccess = false, resultMsg = "網(wǎng)絡打瞌睡了,文件保存失敗" });
}
}
}
/// <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文件上傳內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
作者:追逐時光
作者簡介:一個熱愛編程,善于分享,喜歡學習、探索、嘗試新事物,新技術的程序猿。
相關文章
[Asp.Net Core] 淺談Blazor Server Side
這篇文章主要介紹了[Asp.Net Core] Blazor Server Side 的相關資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下2020-07-07
ASP.NET?MVC使用Quartz.NET執(zhí)行定時任務
這篇文章介紹了ASP.NET?MVC使用Quartz.NET執(zhí)行定時任務的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09

