본문 바로가기
.Net

.NET core 3.1 - File Download

by 올엠 2020. 11. 9.
반응형

.NET file  Download는 다음과 같은 방법으로 구사할 수 있다.

아래 글을 읽어보면 간략히 3가지 방법으로 요약할 수 있다.

 

https://stackoverflow.com/questions/45727856/how-to-download-a-file-in-asp-net-core

 

How to download a file in ASP.NET Core

In MVC, we have used following code to download a file. In ASP.NET core, how to achieve this? HttpResponse response = HttpContext.Current.Response; System.Net.WebClient net = new ...

stackoverflow.com

1. In Memory를 이용한 방법 - 외부 파일 전달에 용이

서버에서 메모리에 파일을 읽어 드린후 클라이언트에게 전달하는 방법이다.

메모리에 파일을 다 로드하여 전달하기 때문데 AWS S3나 외부에 있는 파일도 가능하고, 디스크에 쓰고 전달하는 것보다 쓰는 시간이 줄어들어 빠르게 사용에게 파일을 전달할 수 있다.

만약 메모리에 로드하는 부분이 부담스럽다면 먼저 httpclient를 이용해서 파일을 다운로드하고 전달할 수 있다.

메모리에 로드하기 때문에 파일 용량이 크지 않은 경우 유용하다.

  public ActionResult Download(string filePath)
  {
      byte[] content;
 	  if(filePath.Contains("http://")
      {
         var net = new System.Net.WebClient();
         var data = net.DownloadData(link);
         content = new System.IO.MemoryStream(data);
      }
      content = System.IO.File.ReadAllBytes(filePath);
      new FileExtensionContentTypeProvider().TryGetContentType(Path.GetFileName(filePath), out var contentType);
      return File(fileBytes, contentType ?? "application/octet-stream", "Something.bin");
  }

 

2. FileStream 이용 - 서버 내 파일 전달에 용이

FileStream을 이용하는 방법으로 File을 전달하는 것은 동일하지만, 메모리를 과다하게 사용하지 않는다.

다만 이 경우 외부에서 다운로드해서 처리해야하는 파일이라면, 서버의 파일 시스템에 저장해서 처리해야 한다.

그리고 전달이 완료된 이후 서버에 남아 있는 파일은 어떻게 할 것인지도 결정해야 할 것이다.

대용량 파일 전달에 적합하지만, 외부에서 가져와서 처리해야 한다면, 고민해볼 필요가 있다.

public IActionResult Download(string filePath)
{

    var path = Path.Combine(_hostingEnvironment.WebRootPath, filePath);
    var fs = new FileStream(path, FileMode.Open);

    return File(fs, "application/octet-stream", "Sample.xlsx");
}

 

필자라면, 파일의 크기를 계산해서 처리 방식을 변화하도록 하는 것이 가장 좋을 것이라 판단된다.

반응형