.NET/ASP.NET

[ASP.NET Core Web API] 파일업로드(FileUpload)

클리엘 2021. 3. 23. 16:55
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