ในบทความนี้จะขอกล่าวถึงการ 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.carlrippon.com/zipping-up-files-from-a-memorystream/