前言:
在我們日常開發中,關于圖片,視頻,音頻,文檔等相關文件上傳并保存到服務端中是非常常見的一個功能,今天主要是把自己在開發中常用的兩種方式記錄下來方便一下直接使用,并且希望能夠幫助到有需要的同學!
簡單概述:
在ASP.NET Core應用中靜態資源文件需要進行相應的配置才能夠提供給客戶端直接使用。
詳情描述請參考官方文檔:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/static-files?view=aspnetcore-3.1
簡單配置,提供 Web 根目錄內的文件:
調用 Startup.Configure中的UseStaticFiles 方法配置:
1
2
3
4
|
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 設置自定義此限制:
1
2
3
4
5
6
7
8
|
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 服務器選項自定義限制:
1
2
3
4
5
6
7
8
9
10
11
|
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 字節,大約 28.6 MB。 請在 web.config 文件中自定義此限制:
1
2
3
4
5
6
7
8
|
< system.webServer > < security > < requestFiltering > <!-- Handle requests up to 50 MB --> < requestLimits maxAllowedContentLength = "52428800" /> </ requestFiltering > </ security > </ system.webServer > |
三、單文件上傳:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
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 }); } } } } |
四、多文件上傳:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
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 , returnMsg = "上傳成功" , 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文件上傳內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
作者:追逐時光
作者簡介:一個熱愛編程,善于分享,喜歡學習、探索、嘗試新事物,新技術的程序猿。
原文鏈接:https://www.cnblogs.com/Can-daydayup/p/12637100.html