■ ControllerBase 클래스의 Response 속성을 사용해 파일 다운로드시 스트리밍을 처리하는 방법을 보여준다.
▶ Controllers/TestController.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 67 68 69 70 71 72 73 74 75 |
using Microsoft.AspNetCore.Mvc; using Microsoft.Net.Http.Headers; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; namespace TestProject.Controllers { /// <summary> /// 테스트 컨트롤러 /// </summary> [ApiController] [Route("api/[controller]")] public class TestController : Controller { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 값 리스트 구하기 - GetValueList() // GET api/test /// <summary> /// 값 리스트 구하기 /// </summary> /// <returns>값 리스트</returns> [HttpGet] public List<string> GetValueList() { return new List<string> { "value1", "value2" }; } #endregion #region 파일 다운로드 하기 - DownloadFile() // GET api/test/download /// <summary> /// 파일 다운로드 하기 /// </summary> /// <returns>태스크</returns> [HttpGet] [Route("download")] public async Task DownloadFile() { string filePath = @"d:\The Best of New Age Music Collection.mp4"; Response.Headers.Add(HeaderNames.ContentType , "application/octet-stream"); Response.Headers.Add(HeaderNames.ContentDisposition, $"attachment; filename=\"{Path.GetFileName(filePath)}\"" ); Response.StatusCode = 200; Stream sourceStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); Stream targetStream = Response.Body; int bufferSize = 1024; byte[] bufferByteArray = new byte[bufferSize]; while(true) { int readCount = await sourceStream.ReadAsync(bufferByteArray, 0, bufferSize); if(readCount == 0) { break; } await targetStream.WriteAsync(bufferByteArray, 0, readCount); } await targetStream.FlushAsync(); } #endregion } } |