Download multiple files as Zip Archive (Compressed) file in ASP.Net MVC

ในบทความนี้จะขอกล่าวถึงการ  download file ครั้งละหลายๆไฟล์ โดยมีการระบุว่าต้องการ   download file ใดบ้าง โดย  ผู้ใช้สามารถกดเลือกได้ทั้งละหลายๆไฟล์ หรือไฟล์เดียว แล้วแต่ความต้องการของผู้ใช้งาน โดยหลังจากที่มีการกดปุ่มแล้วระบบจะทำการ zip ไฟล์รวมเป็น 1 ไฟล์ โดยในบทความนี้จะขอเสนอวิธีการพัฒนาโดยใช้ ASP.NET  ในรูปแบบ MVC ค่ะ

 

 

ในส่วนของ java script

function DownloadFiles() {

var items = [];

$(“input:checkbox[name=chkThis]:checked”).each(function () {

items.push($(this).val());

 

});

 

if (items.length <= 0) {

alert(‘กรุณาเลือกข้อมูลที่ต้องการ Download ด้วยค่ะ/ครับ!!’);

}

else {

$.ajax({

type: ‘POST’,

contentType: ‘application/json; charset=utf-8’,

url: ‘@Url.Action(“DownloadAndZipFile”, “NoteUpload”)’,

data: JSON.stringify({ fileItemsAll: items }),

success: function (resultDownload) {

//window.location = ‘/NoteUpload/Download?fileGuid=’ + resultDownload.FileGuid

//                   + ‘&filename=’ + resultDownload.FileName;

window.location = ‘/NoteUpload/Download?fileGuid=’ + resultDownload.FileGuid;

},

error: function (data) {

alert(data);

}

});

}

//   return items;

}

ในส่วนของ controller

public ActionResult DownloadAndZipFile(IEnumerable<int> fileItemsAll)

{

if (!(ViewBag.IsAuthorized = (azResult = azService.Authorize(AccountingOperation.NoteUploadReader, this).Result).IsAuthorize))

{

Danger(string.Format(“ไม่มีสิทธิ์ใช้งานในส่วนนี้: {0} ({1})”, azResult.Operation.OP_NAME, Convert.ToString(azResult.OperationEnum)));

return View();

}

 

string handle = Guid.NewGuid().ToString();

MemoryStream output = new MemoryStream();

 

var zipMs = new MemoryStream();

string strZipName = “Accounting” + DateTime.Now.ToString(“yyyyMMdd”);

 

TempData[handle] = fileItemsAll;

 

var resultDownload = new { FileGuid = handle, FileName = strZipName + “.zip” };

return this.Json(resultDownload, JsonRequestBehavior.AllowGet);

}

 

public FileResult Download(string fileGuid)

{

if (!(ViewBag.IsAuthorized = (azResult = azService.Authorize(AccountingOperation.NoteUploadReader, this).Result).IsAuthorize))

{

Danger(string.Format(“ไม่มีสิทธิ์ใช้งานในส่วนนี้: {0} ({1})”, azResult.Operation.OP_NAME, Convert.ToString(azResult.OperationEnum)));

return null;

}

 

var zipMs = new MemoryStream();

string zipFisYear, zipPeriod, fileC, FileF, FileFinance, fileID, fileNameZip = null;

 

if (TempData[fileGuid] != null)

{

using (ZipFile zip = new ZipFile())

{

foreach (var item in TempData[fileGuid] as IEnumerable<int>)

{

var dataItemSelect = db.NoteUploadViews.Where(g => g.ID == item).FirstOrDefault();

var financeID = db.FinanceBudgets.Where(g => g.FINANCE_BUDGET_ID == dataItemSelect.FINANCE_BUDGET_ID).FirstOrDefault();

zipFisYear = dataItemSelect.FISCAL_YEAR_ID.ToString();

zipPeriod = dataItemSelect.QUARTER.ToString();

 

var dataORG = db.Organizations.Where(g => g.ORG_ID == dataItemSelect.ORG_ID && g.FISCAL_YEAR_ID == dataItemSelect.FISCAL_YEAR_ID).FirstOrDefault();

fileC = Right(“000” + dataORG.ORG_ID, 3);

FileF = Right(“000” + dataItemSelect.ORG_ID, 3);

FileFinance = Right(“000” + financeID.FINANCE_ID.ToString(), 3);

zipFisYear = Right(“0000” + dataItemSelect.FISCAL_YEAR_ID.ToString(), 4);

zipPeriod = dataItemSelect.QUARTER.ToString();

fileNameZip = zipFisYear + zipPeriod + “.zip”; //JAR+ Format for Zip name = FiscalYear|PeriodID >> 25601

 

var fileType = dataItemSelect.FILE_TYPE;

var fileNameInzip = fileC + FileF + FileFinance + dataItemSelect.ID.ToString() + “.” + fileType;  //JAR+  Format for  File Name = Campus|Fac|Finance|ID >> C01F010031

 

byte[] fileDatas = (byte[])dataItemSelect.FILE_DATA;

 

zip.AddEntry(fileNameInzip, fileDatas);

}

 

zip.Save(zipMs);

 

byte[] fileData = zipMs.GetBuffer();

zipMs.Seek(0, SeekOrigin.Begin);

 

zipMs.Flush();

Response.Clear();

Response.AddHeader(“content-disposition”, “attachment;filename=” + fileNameZip);

Response.BinaryWrite(fileData);

Response.End();

}

}

 

return File(zipMs, “application/zip”);

}

จากตัวอย่างข้างต้นจะเห็นว่าในปัจจุบัน มีความต้องการไม่น้อยที่จะ download ไฟล์หลายๆไฟล์ แล้วรวมเป็นไฟล์เดียว เพื่อความสะดวกในการจัดเก็บข้อมูล และวิธีการพัฒนาก็ไม่ได้ยุ่งยาก ผู้เขียนจึงหวังเป็นอย่างยิ่งว่าจะเป็นประโยชน์ไม่มากกว่าน้อยสำหรับผู้พัฒนาในรูปแบบ MVC นะคะ

 

 

 แหล่งอ้างอิง

https://www.aspsnippets.com/Articles/Download-multiple-files-as-Zip-Archive-Compressed-file-in-ASPNet-MVC.aspx

https://www.carlrippon.com/zipping-up-files-from-a-memorystream/