728x90
파일 업로드 API가 들어갈 컨트롤러가 Home이라는 가정하에 다음과 같이 생성자를 추가합니다.
private readonly IWebHostEnvironment _environment;
public HomeController(IWebHostEnvironment enviroment)
{
_environment = enviroment;
}
IWebHostEnvironment 인터페이스로부터 받는 WebHostEnvironment 객체는 현재 root 폴더의 경로를 알 수 있도록 하며 이를 기준으로 업로드할 폴더를 찾아들어갈 것입니다.
주의할 점은 ASP.NET Core로 순수 Web API 프로젝트를 만들게 되면 wwwroot폴더는 프로젝트에 포함되지 않을 수 있는데 이런 경우 생성자로부터 받는 environment변수는 null이 됩니다. 따라서 프로젝트에 wwwroot폴더를 생성하거나 혹은 null인 경우 Directory.GetCurrentDirectory()와 같은 것으로 대체할 수 있는 방안을 마련해야 합니다.
이제 HomeController에 파일을 받을 수 있는 메서드를 생성합니다.
[HttpPost]
public async Task<IActionResult> Post(List<IFormFile> files)
{
var uploadFolder = Path.Combine(_environment.WebRootPath, "files");
foreach (var file in files)
{
if (file.Length > 0)
{
var fileName = Path.GetFileName(ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"'));
using (var fileStream = new FileStream(Path.Combine(uploadFolder, fileName), FileMode.Create))
{
await file.CopyToAsync(fileStream);
}
}
}
return Ok(new { message = "OK" });
}
파일이 업로드될 위치는 wwwroot안에 있는 files폴더라고 가정합니다. PostMan을 사용하여 위 메서드를 테스트해 봅니다.
ASP.NET Core의 기본 파일업로드 용량은 28MB정도로 알려져 있는데 만약 업로드가능한 용량을 늘리려 한다면 해당 API메서드에 다음과 같은 특성을 부여합니다.
[RequestFormLimits(MultipartBodyLengthLimit = 314_572_800)]
[RequestSizeLimit(314_572_800)]
public IActionResult Post(List<IFormFile> files)
서버에서도 대용량파일의 요청을 받아들일 수 있도록 설정해야 합니다. 만약 IIS라면 다음과 같이 web.config에서 요청가능한 최대용량을 설정할 수 있습니다.
참고로 예제로 설정된 용량은 300MB(300 * 1024 * 1024)입니다.
728x90
'.NET > ASP.NET' 카테고리의 다른 글
[ASP.NET Core Web API] 프로젝트및 Controller 생성 (0) | 2021.03.25 |
---|---|
[ASP.NET Core Web API] Swagger와 API 명세 (0) | 2021.03.25 |
[ASP.NET Core Web API] DI (Dependency Injection) 구현 (Autofac) (0) | 2021.03.23 |
[ASP.NET Core Web API] JWT 인증 (6) | 2021.03.23 |
[.NET Core] DB로 부터 Model 생성하기 (MySQL/MariaDB) (0) | 2021.03.21 |