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메뉴를 클릭하면 아래와 같이 리스트가 나타납니다.
Download link를 클릭하면 아래와 같이 다운로드 박스가 나올겁니다.