재우니의 블로그


먼저 아래 블로그를 숙지 한다음에 아래 강좌를 읽으면 좀 더 수월할거라 생각듭니다.


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" /> @:&nbsp; @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");
}