본문 바로가기

.NET/MVC.NET

ASP.NET MVC 3 을 이용한 파일 다운로드

http://www.dotnetcurry.com/ShowArticle.aspx?ID=807

 

위에서 퍼온 글입니다.

여러분들이 아시다시피 컨트롤러의 action 메서드는 ActionResult라는 추상화된 객체를 반환하게 되어있습니다. 여러 클래스들이 ActionResult를 상속받아서 구현이 되어있는데 그중에 하나가 바로 FileResult입니다. 이 클래스는 binary 파일의 컨텐츠를 리스폰스 해주는 역할을 해줍니다. 아래의 예제를 통해 우리는 어떻게 AfileResult action을 통해 파일을 다운로드 받는지 알수 있습니다.

Step 1:  VS2010을열고 ASP.Net MVC3 프로젝트를 'MVC3_Returning_Files'라고 만듭니다.

Step 2:  이 프로젝트에 새로운 폴더 'Files'를 추가하고 한 두개의 PDF파일들을 넣습니다.

Step 3: R모델 폴더에 오른쪽 마우스를 클릭하고 새로운 class파일을 추가합니다. 그리고 이름을 'DataClasses.cs'라고 합니다. 그 다음으로는 아래의 코드를 삽입합니다.

namespace MVC3_Returning_Files.Models
{
    public class DataClasses
    {
        public List<FileNames> GetFiles()
        {
            
            List<FileNames> lstFiles = new List<FileNames>();
            DirectoryInfo dirInfo = new DirectoryInfo(HostingEnvironment.MapPath("~/Files"));
            
            int i = 0;
            foreach (var item in dirInfo.GetFiles())
            {

                lstFiles.Add(new FileNames() {

                FileId = i + 1, FileName = item.Name, FilePath = dirInfo.FullName+@"\"+item.Name});
                i = i + 1;
            }
            
            return lstFiles; 
        }
    }

    public class FileNames
    {
        public int FileId { get; set; }
        public string FileName { get; set; }
        public string FilePath { get; set; }
    }
}

위의 클래스 DataClasses 는 ‘GetFiles’ 라는 메서드를 포함하는데 이 메서드는 'Files'라는 폴더에 담겨져 있는 PDF파일을 읽어 들여 FileNames이라는 클래스 리스트로 반환합니다.

Step 4: A새로운 컨트롤러를 ‘ReportsController’라 이름하고 다음 엑션메서드에 아래와 같이 코딩을 합니다.

namespace MVC3_Returning_Files.Controllers
{
    public class ReportsController : Controller
    {
        DataClasses objData;

        public ReportsController()
        {
            objData = new DataClasses(); 
        }

        //
        // GET: /Reports/

        public ActionResult Index()
        {
            var files = objData.GetFiles();  
            return View(files);
        }

       
        public FileResult Download(string id)
        {
            int fid = Convert.ToInt32(id);
            var files = objData.GetFiles();
            string filename = (from f in files
                               where f.FileId == fid
                               select f.FilePath).First();
            string contentType = "application/pdf";
            //Parameters to file are
            //1. The File Path on the File Server
            //2. The content type MIME type
            //3. The parameter for the file save by the browser
            return File(filename, contentType,"Report.pdf");
        }

    }
}

 

'Download' 엑션 메서드는 id(FileId)를 뷰에서 넘겨 받고 그 넘겨받은 id로 GetFiles메서드를 통해서 반환된 리스트에서 질의를 하게 됩니다. 질의 후에 file path를 추출하고 MIME  type을 정의하고 파일메서드를 통해 리턴해 줍니다.

Step 5: 새로운 Index View를 생성하고 아래와 같이 코딩을 합니다.

model IEnumerable<MVC3_Returning_Files.Models.FileNames>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
     <th>
            FileId
        </th>
        <th>
            FileName
        </th>
    </tr>

@foreach (var item in Model) {
    <tr>
    <td>
            @Html.DisplayFor(modelItem => item.FileId)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FileName)
        </td>
        <td>
            @Html.ActionLink("Download", "Download", new { id = item.FileId }) 
          
        </td>
    </tr>
}

</table>

 

Step 6: A _Layout.cshtml 의 <div>안에 아래와 같이 Action link를 삽입합니다.

<li>@Html.ActionLink("Reports", "Index", "Reports")</li>

Step 7: 어플리케이션을 실행하면 리포트 메뉴를 발견할수 있을겁니다. Reprots메뉴를 클릭하면 아래와 같이 리스트가 나타납니다.

MVC 3 Download File

Download link를 클릭하면 아래와 같이 다운로드 박스가 나올겁니다.

image