انتخاب و دانلود چند فایل به صورت Zip شده در MVC

چهارشنبه 7 بهمن 1394

ممکن است در وب سایت های مختلف دیده باشید که لیستی از فایل های مختلف به کاربر نشان داده می شود تا از بین آنها فایل یا فایل های مورد نظر را انتخاب و دانلود کند. در این حالت یک درخواست zipped bundle فرستاده شده و فایل ها به صورت یک دانلود دریافت می شوند. در این مقاله نشان می دهیم که چگونه این عمل را پیاده سازی کنیم.

انتخاب و دانلود چند فایل به صورت Zip شده  در MVC

در اینجا می خواهیم صفحه ای بسازیم که شامل لیستی از فایلهای موجود بر روی سرور می باشد. هر فایل یک checkbox در کنار خود دارد که با انتخاب آن نشان میدهد آیا فایل شامل بسته دانلود می باشد یا خیر. بعد از انتخاب یک یا چند checkbox  می توانید بر روی دکمه "دانلود فایل های انتخابی" کلیک کرده و آنها را دانلود کنید. با این کار یک فایل Zip ایجاد شده و فایل های انتخابی به آن اضافه می شود.

برای شروع کار ابتدا یک اپلیکیشن  ASP.NET MVC به صورت خالی ایجاد می کنیم. سپس دو فولدر با نام های Images و ZippedFiles  در ریشه یا root پروژه ایجاد کنید. فولدر Images شامل فایل هایی است که روی سرور قرار می گیرند و فولدر ZippedFiles شامل فایل های Zip شده می باشد. ما در این نمونه برنامه برای سادگی کار از تصویر در فولدر images استفاده کرده ایم وگرنه می توانید از هر نوع فایلی به جای تصاویر استفاده کنید.

حالا HomeController را به پوشه Controllers اضافه کرده و اکشن ( ) Index را به صورت زیر تغییر می دهیم:

 

public ActionResult Index()
{
    string[] files = Directory.GetFiles(
                    Server.MapPath("~/images"));
    List<string> downloads = new List<string>();
    foreach(string file in files)
    {
        downloads.Add(Path.GetFileName(file));
    }
    return View(downloads);
}

این کد از متد ( ) GetFiles در فضای نام System.IO استفاده می کند تا فایل های موجود در فولدر Images را بازیابی کند. سپس آن فایل ها را به یک لیست اضافه می کند. توجه داشته باشید که( )GetFiles مسیر کامل و نام را برای تمام فایل ها برمی گرداند. زمانی که فایل ها در حال اضافه شدن به generic List هستند فقط نام فایل را می گیریم. این کار با استفاده از متد ( )GetFileName  از کلاس Path انجام می شود.

این لیست به صفحه index به عنوان model ارسال می شود.

سپس اکشن دیگری با نام ( ) ProcessForm به HomeController اضافه می کنیم. این اکشن فایل Zip را به صورت زیر ایجاد می کند:

[HttpPost]
public ActionResult ProcessForm(List<string> selectedfiles)
{
    if(System.IO.File.Exists(Server.MapPath
                      ("~/zipfiles/bundle.zip")))
    {
        System.IO.File.Delete(Server.MapPath
                      ("~/zipfiles/bundle.zip"));
    }
    ZipArchive zip = ZipFile.Open(Server.MapPath
             ("~/zipfiles/bundle.zip"), ZipArchiveMode.Create);
    foreach (string file in selectedfiles)
    {
        zip.CreateEntryFromFile(Server.MapPath
             ("~/images/" + file), file);
    }
    zip.Dispose();
    return File(Server.MapPath("~/zipfiles/bundle.zip"), 
              "application/zip","bundle.zip");
}

 

کلاسهای ZipArchieve و ZipFile در فضای نام System.IO.Compression تعریف شده اند به همین خاطر باید رفرنس های System.IO.Compression.dll و System.IO.Compression.FileSystem.dll  را از قسمت assemblies به پروژه اضافه کنید.

اکشن ( )ProcessForm لیستی از رشته ها را دریافت می کند. این متد لیستی از مقادیر checkboxe ها را روی صفحه نمایش می دهد.

model binding در MVC به اندازه کافی هوشمند است و این لیست را برای ما پر کند. 

این کد چک می کند که آیا یک فایل با نام Bundle.zip از قبل روی سرور وجود دارد یا خیر، اگر چنین است که فایل حذف می شود. Bundle.zip  فایلی است که به صورت داینامیک در مراحل بعد ایجاد می شود. اگر بخواهید می توانید نام آن را هم به طور داینامیک ایجاد کنید.

متد ( )Openاز کلاس ZipFile برای ایجاد فایلBundle.zip داخل فولدر ZipFiles استفاده می شود. مقدار بازگشتی از متد ( )Open شیئ ZipArchive  می باشد. سپس یک حلقه foreach از طریق لیست فایل های انتخاب شده selectedfiles تکرار می شود.هر فایل انتخاب شده یک مسیر کامل برای استفاده از متد ( )MapPath دارد و متد( ) CreateEntryFromFile از شیئ ZipArchive  تغذیه می شود.

هنگامی که تمام فایل ها به Bundle.zip اضافه شود این فایل توسط متد ( )File برگردانده می شود. متد ( ) File سه پارامتر می گیرد:

-مسیر کامل برای ارسال فایل به مرورگر کاربر 

-نوع محتوای MIME  در فایل ها 

- نام فایل هایی که قرار است روی مرورگر برای دانلود نشان داده شود(browser's download dialog).

View مربوط به index به سادگی از طریق لیستی از فایل های ارسال شده را توسط foreach تکرار می کند و یک جدول را نمایش می دهد.

یک Helper استفاده شده با نام ( ) BeginForm ، فرم را به اکشن ( )ProcessForm ارسال می کند. توجه کنید که چگونه checkboxes ها نمایش داده می شوند. تمام checkboxe ها به همین نام  selectedfiles هستند و این نام باید با پارامتر اکشن( ) ProcessForm مطابق شود. مقدار attribute در checkboxe ها برای نام فایل تنظیم می شود.

حالا برنامه را اجرا کنید و خروجی به صورت زیر نشان داده می شود:

 

تعدادی فایل را انتخاب کرده و بر روی دکمه دانلود کلیک کنید:

 

بالافاصله مرورگر پنجره ای برای ذخیره فایل Bundle.zip به شما نشان می دهد:

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید