انتخاب و دانلود همزمان چند فایل با استفاده از GridView

در این مقاله، نشان می دهیم که چگونه چندین فایل را از GridView دانلود کرده و آنها را در یک فولدر فشرده کنیم.

انتخاب و دانلود همزمان چند فایل با استفاده از  GridView

دانلود یکی از مهم ترین موارد برای کاربران می باشد و هر کاربری می خواهد داده ای را دانلود کند. این داده ها می تواند، یک فایل متنی، ویدئو و یا صدا باشد اما در پس همه این ها مهم ترین نکته این است که چگونه بدون اینکه با مشکلی مواجه شویم بتوانیم داده ها را دانلود کنیم. گاهی اوقات می خواهیم فایلی را دانلود کنیم که به چندین بخش تقسیم شده است، که این کار برای کاربران اغلب بسیار سخت است و مدت زمان بیشتری طول می کشد تا تک به تک فایل ها را دانلود کنیم، چرا که زمانی صرف کلیک کردن روی یک به یک این فایل ها و دانلود کردن آنها می شود. بنابراین برای حل این مشکل، نشان می دهیم که چگونه می توان تمام فایل های دلخواه را همزمان و در زمان دانلود به حالت فشرده درآورده و دانلود نماییم.

بنابراین در اینجا گام به گام نشان می دهیم که چگونه چندین فایل را دانلود کرده و آنها را با فرمت فشرده(Zip) ذخیره می کنیم. همانطور که می دانیم، فایل های فشرده همیشه در یک فولدر واحد و کنار هم ذخیره می شوند و همچنین حافظه کمتری مصرف می کنند. 

گام اول:

ویژوال استودیو را باز کرده و یک پروژه وب از نوع Empty ایجاد می کنیم.


گام دوم:

بعد از ایجاد پروژه، اولین کاری که باید انجام دهیم دانلود SharpZipLib می باشد. SharpZipLib یک API است که برای zip کردن فایل ها می توانیم از آن استفاده کنیم. SharpZipLib رایگان است، حجم زیادی هم ندارد و به راحتی می توانید آن را دانلود کرده و نصب نمایید. 

گام سوم:

روی نام پروژه خود راست کلیک کرده و یک Webform به صفحه اضافه می کنیم.

گام چهارم:

پس از اضافه کردن Webform، یک فولدر جدید به صفحه اضافه کرده و نام آن را zipped file و یا هر نام دلخواه دیگری می گذاریم. این فولدر شامل فایل هایی خواهد بود که می خواهیم دانلود کنیم. این فایل می تواند هر نوع اطلاعاتی از قبیل فیلم، صدا و یا متن باشد.

گام پنجم:

حال یک  GridView به صفحه خود اضافه می کنیم تا این فایل ها را به آن متصل(Bind) کنیم و بتوانیم آنها را در GridView نمایش دهیم. حال ببینیم چگونه باید فایل های موجود در فولدر Zipped file را به GridView متصل کنیم. این کار بسیار ساده است، می توانید نحوه انجام آن را در کد زیر مشاهده نمایید.

این کد در صفحه Default.aspx نوشته می شود:

    <asp:GridView ID="griddownload" runat="server" AutoGenerateColumns="false" AlternatingRowStyle-BackColor="#99ccff" HeaderStyle-BackColor="#000099" HeaderStyle-ForeColor="White">  
      <Columns>  
      <asp:TemplateField HeaderText=" چک باکس را برای انتخاب فایل ها تیک بزنید">  
      <ItemTemplate>  
      <asp:CheckBox ID="chkselect" runat="server" />  
      </ItemTemplate>  
      </asp:TemplateField>              
      <asp:TemplateField HeaderText="نام فایل">  
      <ItemTemplate>  
      <asp:Label ID="lblFileName" runat="server" Text='<%# Eval("FileName") %>' />  
      <asp:Label ID="lblFilePath" Visible="false" runat="server" Text='<%# Eval("FilePath") %>' />  
      </ItemTemplate>  
      </asp:TemplateField>  
      </Columns>  
      </asp:GridView>  

گام ششم:

با کد زیر، فایل ها از بین آیتم های فولدر Zipped File به GridView متصل شدند، و به صورت CheckBox در آن نمایش داده می شوند.

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

    private void bindgrid()  
      {  
          var files = Directory.GetFiles(Server.MapPath("~/Zipped File"));  
      
          griddownload.DataSource = from f in files  
                               select new  
                               {  
                                   FileName = Path.GetFileName(f),  
                                   FilePath = f  
                               };  
          griddownload.DataBind();  
      }  

پس از تعریف این متد، آن را در رویداد Page Load صفحه فراخوانی می کنیم.

    if (!Page.IsPostBack)  
            {  
                bindgrid();  
            }  

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


همان طور که می بینید، این جدول دو ستون دارد که در یکی از آنها checkBoxها برای انتخاب وجود دارند و در ستون دوم، نام فایل های موجود در فولدر Zipped File را می بینیم.

گام هفتم:

حال یک button و  lable به صفحه اضافه می کنیم که button برای انتخاب فایل ها با استفاده از checkboxها می باشد که با کلیک روی آن دانلود شروع می شود و Lable برای نمایش پیام استفاده می شود که وقتی فایلی را انتخاب نکرده و روی button کلیک کنیم، پیامی را نمایش دهد.

حال یک متد می نویسیم که با استفاده از آن، فایل های داخل فولدر Zipped file را یک به یک انتخاب کنیم و زمانی که کاربر روی دکمه دانلود کلیک کند، در یک فولدر با فرمت Zip دانلود می شوند. حال یک فولدر به سایت خود اضافه می کنیم تا فایل ها را در آن به صورت موقت Zip  کنیم. در اینجا ما برای نام گذاری فایل های Zip شده موقتی از نام های تصادفی استفاده می کنیم.

گام نهم:

متدی که با استفاده از آن فایل ها را انتخاب و به طور موقت ذخیره می کنیم، به شکل زیر می باشد:

    private void zippedfile()  
        {  
            byte[] buffer = new byte[6144];  
            var filedownload = Server.MapPath(@"tempfolder/" + Guid.NewGuid().ToString() + ".zip");  
      
            var zipOutputStream = new ZipOutputStream(File.Create(filedownload));  
            var filePath = String.Empty;  
            var fileName = String.Empty;  
            var readBytes = 0;  
      
            foreach (GridViewRow row in griddownload.Rows)  
            {  
                var isChecked = (row.FindControl("cboxselect") as CheckBox).Checked;  
                if (!isChecked) continue;  
                fileName = (row.FindControl("lblfname") as Label).Text;  
                filePath = (row.FindControl("lblpath") as Label).Text;  
                var addzipfile = new ZipEntry(fileName);  
      
                zipOutputStream.PutNextEntry(addzipfile);  
      
                using (var fs = File.OpenRead(filePath))  
                {  
                    do  
                    {  
                        readBytes = fs.Read(buffer, 0, buffer.Length);  
                        zipOutputStream.Write(buffer, 0, readBytes);  
      
                    } while (readBytes > 0);  
                }  
            }  
      
            if (zipOutputStream.Length == 0)  
            {  
                lblMessage.Text = "حداقل یک فایل را انتخاب نموده و سپس دکمه دانلود را بزنید!!";  
                return;  
            }  
      
            zipOutputStream.Finish();  
            zipOutputStream.Close();  
            Response.ContentType = "application/x-zip-compressed";  
            Response.AppendHeader("Content-Disposition", "attachment; filename=DownloadedFile.zip");  
            Response.WriteFile(filedownload);  
            Response.Flush();  
            Response.Close();  
            if (File.Exists(filedownload))  
                File.Delete(filedownload);  
        }  

گام دهم:

بعد از نوشتن این متد، آن را در رویداد کلیک button فراخوانی می کنیم. سپس زمانی که برنامه را اجرا نمایید، خروجی زیر را مشاهده خواهید کرد.

همانطور که در شکل می بینید، 6 فایل انتخاب شده اند که با زدن دکمه دانلود، همزمان و در یک فولدر zip دانلود می شوند.

زمانی که شما هیچ فایلی را انتخاب نکرده و روی دکمه دانلود کلیک نمایید، با پیغام خطای زیر رو به رو می شوید.

 

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