ASP.NET/ASP.NET Core
[ASP.Net Core] 대용량 파일 업로드 시키기
http://portfolio.wonpaper.net
2024. 3. 8. 04:02
최대 1GB 의 대용량 파일 업로드를 시키는 방법을 고안해 보았다.
https://github.com/wonpaper/BigFileUpload
[ Program.cs ]
1
2
3
4
5
6
7
8
9
10
11
12
|
using Microsoft.AspNetCore.Http.Features;
....
// 전역으로 최대업로드 용량 설정
builder.WebHost.ConfigureKestrel(options => {
options.Limits.MaxRequestBodySize = 1024 * 1024 * 1024; // 1GB
});
builder.Services.Configure<FormOptions>(options => {
options.MultipartBodyLengthLimit = 1024 * 1024 * 1024; // 1GB
});
|
cs |
Global 하게 설정해 놓았다.
위에서 대용량 파일 처리중에 제일 중요한 부분이
using Microsoft.AspNetCore.Http.Features;
요놈이다. 임포트해서 FormOptions 객체를 이용해서 쓴다.
[ HomeController.cs ]
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
|
using BigFileUpload.Models;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using System.Net.Http.Headers;
namespace BigFileUpload.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private IWebHostEnvironment environment;
public HomeController(ILogger<HomeController> logger, IWebHostEnvironment environment)
{
_logger = logger;
this.environment = environment;
}
public IActionResult Index()
{
return View();
}
[HttpPost]
//[RequestSizeLimit(1024 * 1024 * 1024)]
public async Task<IActionResult> Index(ICollection<IFormFile> file1)
{
var uploadFolder = String.Empty;
string fileName1 = String.Empty;
int fileSize1 = 0;
uploadFolder = Path.Combine(environment.WebRootPath, "files/Notice");
foreach (var file in file1)
{
if (file.Length > 0)
{
fileSize1 = Convert.ToInt32(file.Length);
// 파일명 중복 처리
fileName1 = Dul.FileUtility.GetFileNameWithNumbering(
uploadFolder, Path.GetFileName(ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"')));
// 파일 업로드
using (var fileStream = new FileStream(
Path.Combine(uploadFolder, fileName1), FileMode.Create))
{
await file.CopyToAsync(fileStream);
}
}
}
return View(file1);
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}
|
cs |
26 라인의 주석으로 막아 놓은부분은 Global 하게 설정해 놓았기 때문에 쓸 필요가 없다.
[ Index.cshtml ]
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
|
@model ICollection<IFormFile>
@{
ViewData["Title"] = "Home Page";
string FormatFileSize(long fileSizeInBytes)
{
const int byteConversion = 1024;
double bytes = Convert.ToDouble(fileSizeInBytes);
if (fileSizeInBytes >= Math.Pow(byteConversion, 3)) // Size is greater than or equal to 1 GB
{
return $"{bytes / Math.Pow(byteConversion, 3):0.##} GB";
}
else if (fileSizeInBytes >= Math.Pow(byteConversion, 2)) // Size is greater than or equal to 1 MB
{
return $"{bytes / Math.Pow(byteConversion, 2):0.##} MB";
}
else if (fileSizeInBytes >= byteConversion) // Size is greater than or equal to 1 KB
{
return $"{bytes / byteConversion:0.##} KB";
}
else // Size is less than 1 KB
{
return $"{bytes} bytes";
}
}
}
<div class="text-center">
<h1 class="display-4">대용량 파일 업로드 (최대 1GB까지)</h1>
<form name="f" method="post" enctype="multipart/form-data">
<div class="form-group">
<div>
<input type="file" name="file1" class="form-control">
</div>
<div class="mt-3">
<button class="btn btn-primary" type="submit">Send</button>
</div>
@if (Model != null)
{
<div class="mt-3">
파일명: @Model.ElementAt(0).FileName
<br />
파일크기: @FormatFileSize(Model.ElementAt(0).Length)
</div>
}
</div>
</form>
</div>
|
cs |
참고 : https://www.youtube.com/watch?v=ollScUHiFKs
추가로 아래의 유투브 내용도 시간도 짧고 아주 괜찮았다.
https://www.youtube.com/watch?v=SqhqLDrzzaM