먼저 아래 블로그를 숙지 한다음에 아래 강좌를 읽으면 좀 더 수월할거라 생각듭니다.
1. zip 파일을 올려서 압축 풀어 서버에 저장하는 방법을 알아보죠.
@using (Html.BeginForm("Index", "Home", FormMethod.Post,
new { enctype = "multipart/form-data" }))
{
<input type="file" name="zip" />
<div>
<button class="btn btn-default">Submit</button>
</div>
}
이제 컨트롤러를 구현해 보죠. 받은 zip 파일을 stream 으로 받아 ZipArchiveEnty 를 통해 압축 내부의 파일을 얻을 수 있으며 폴더가 존재하면 곧바로 ExtractToFile 함수를 통해 저장하고, 폴더가 없으면 디렉토리 폴더를 생성과 동시에 CreateDirectory 함수를 통해 함께 처리합니다.
[HttpPost]
public ActionResult Index(HttpPostedFileBase zip)
{
var uploads = Server.MapPath("~/uploads");
using (ZipArchive archive = new ZipArchive(zip.InputStream))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
if (!string.IsNullOrEmpty(Path.GetExtension(entry.FullName)))
{
entry.ExtractToFile(Path.Combine(uploads, entry.FullName));
}
else
{
Directory.CreateDirectory(Path.Combine(uploads, entry.FullName));
}
}
}
ViewBag.Files = Directory.EnumerateFiles(uploads);
return View();
}
2. 압축을 하여 파일을 다운로드 받아보는 방법을 알아보죠.
public ActionResult Index()
{
ViewBag.Files = Directory.EnumerateFiles(Server.MapPath("~/pdfs"));
return View();
}
뷰 화면에 출력해 보자. 특정 폴더에 접근하여 내부의 파일들을 foreach 구문으로 출력을 합니다. 서버 내부의 첨부파일 경로를 checkbox 에 담습니다.
<h2>Select downloads</h2>
@using(Html.BeginForm("Download", "Home"))
{
foreach(string file in ViewBag.Files)
{
<input type="checkbox" name="files" value="@file" /> @:
@Path.GetFileNameWithoutExtension(file) <br />
}
<div>
<button class="btn btn-default">Submit</button>
</div>
}
컨트롤러를 구현해 보죠. checkbox 에 담은 값을 post 로 전송한 첨부파일 값들을 배열로 받아 임시폴더를 하나 만들고 (temp), 그 임시폴더 내부에 파일이 있으면 전부 삭제하고, 첨부파일들을 복사하여 임시폴더에 담아 ZipFile.CreateFromDirectory() 함수를 통해 archive.zip 압축파일명을 만들어 생성한 다음 FileResult 형식으로 반환하여 다운로드 받게 합니다.
[HttpPost]
public FileResult Download(List<string> files)
{
var archive = Server.MapPath("~/archive.zip");
var temp = Server.MapPath("~/temp");
// clear any existing archive
if (System.IO.File.Exists(archive))
{
System.IO.File.Delete(archive);
}
// empty the temp folder
Directory.EnumerateFiles(temp).ToList().ForEach(f => System.IO.File.Delete(f));
// copy the selected files to the temp folder
files.ForEach(f => System.IO.File.Copy(f, Path.Combine(temp, Path.GetFileName(f))));
// create a new archive
ZipFile.CreateFromDirectory(temp, archive);
return File(archive, "application/zip", "archive.zip");
}