반응형
.NET file Download는 다음과 같은 방법으로 구사할 수 있다.
아래 글을 읽어보면 간략히 3가지 방법으로 요약할 수 있다.
https://stackoverflow.com/questions/45727856/how-to-download-a-file-in-asp-net-core
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");
}
필자라면, 파일의 크기를 계산해서 처리 방식을 변화하도록 하는 것이 가장 좋을 것이라 판단된다.
반응형
'.Net' 카테고리의 다른 글
.Net/C#/Core - How to Get Client IP on HTTP (0) | 2020.11.10 |
---|---|
.NET core 3.1 - ActionLink glyphicon 사용하기 (0) | 2020.11.09 |
.Net - Web application Ubuntu 배포하기 (0) | 2020.11.08 |
.Net core - File Uplad Error 413.1 - Request Entity Too Large (0) | 2020.11.05 |
The underlying connection was closed – REST API call over HTTPS (0) | 2020.11.04 |