آموزش دانلود چند فایل هم زمان در ASP.NET
Loading...
دانلود چند فایل هم زمان

با آموزش دانلود چند فایل هم زمان در ASP.NET با شما هستم.وقتی می خواهیم با استفاده از ASP.NET application برای کلاینت، یک مجموعه از فایلها را ارسال کنیم به مشکلاتی برخورد می کنیم که در این مقاله راه حل های آن را بررسی می کنیم.

هرازگاهی یک سوال در انجمن مطرح می شود، چرا کدهای مربوط به دانلود مجموعه ای از فایل ها به درستی کار نکرده و تنها فایل اول فرستاده می شود. معمولا، این کدها شامل یک حلقه ی تکرار است که روی مجموعه ای از فایل ها تکرار می شود و تلاش می کند تا از پاسخ(Response) استفاده کند. TransmitFile  یا FileResult  در MVC  مسئول ارسال فایلها به کلاینت هستند ولی به درستی عمل نمی کنند زیرا این کار اساسا غیرممکن است و به دلایل امنیتی از آن پشتیبانی نمی شود. در صورت انجام این کار، فرصت خوبی را به خرابکاران می دهیم. یک وبمستر خرابکار به کمک قابلیت Drive-by Download می تواند یک بدافزار(malware) را به فایل درخواستی کلاینت اضافه کرده و آن را به طور کامل بفرستد.

دانلود چند فایل هم زمان

راه حل پیشنهادی فشرده سازی فایل ها در یک فایل آرشیو و سپس دانلود آن است. مثالهایی هست که به طور کامل نحوه انجام این کار را با استفاده از کتابخانه مختلف third party zip نشان می دهد. چرا از این مثال ها استفاده می کنیم؟ زیرا در فریمورک .NET برای اینکار راه حل خاصی مطرح نشده بود اما در نسخه .NET 4.5 و با اضافه شدن System.IO.Compression امکان فشرده سازی فایلها فراهم می شود؛ به خصوص کلاس ZipFile از این کتابخانه که امکان ایجاد و کار با .zip را فراهم می کند.

مثالهای ساده ی زیادی وجود دارد که چگونگی استفاده از متد ZipFile.CreateFromDirectory در ASP.NET MVC و Web Form را نشان می دهد، در هردو مورد، برای کاربر یک لیست از checkboxes های مربوط به انتخاب فایلها نمایش داده می شود که امکان انتخاب فایل ها را فراهم می کند. وقتی دکمه تایید فرم فعال شود تمامی فایلها در یک بسته، فشرده شده و دانلود می شوند.

ASP.NET MVC

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

public ActionResult Index()
{
    ViewBag.Files = Directory.EnumerateFiles(Server.MapPath("~/pdfs"));
    return View();
}

فایلها ،در مجموعه ای از 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) 
    }
    
<div>
        <button class="btn btn-default">Submit</button>
    </div>

}

و حالا کدهای form posts برای انجام عمل Download :

[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");
}

برای استفاده از کدهای بالا، باید با استفاده از using  ،دو دایرکتیو زیر را به کلاس کنترلر اضافه کنید:

using System.IO;
using System.IO.Compression;

انتخاب های کاربر در پارامترهای فایل نگه داری می شوند. درکد بالا، اگر فایلی با نام archive.zip در عملیات های قبلی وجود داشته باشد آن را حذف می کند. سپس محتوای پوشه ی temp به طور کامل پاک می شود. سپس، یک کپی از فایل های انتخابی از دایرکتوری منبعشان به پوشه temp منتقل می شوند. متد ZipFile.CreateFromDirectory از محتوای دایرکتوری temp یک فایل zip تولید کرده و با نام archive.zip ذخیره می کند. در نهایت، نوبت به قسمت Response می رسد.

Web Forms

این راه حل Download.aspx نامیده می شود( این ویژگی مخصوص کار با تک صفحه هاست). فایل aspx شامل نشانه گذاری هایی برای یک CheckBoxList و Button control است:

<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>
}

متد Page_Load در کد قبل از فایل، شباهت زیادی با متد Action در مثال MVC دارد. اگر صفحه post back نشده بودند، یک لیست از فایلها گردآوری شده و به CheckBoxList ، مقید می شوند.

public partial class Download : Page
{
        
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            CheckBoxList1.DataSource = Directory.GetFiles(Server.MapPath("~/PDFs"));
            CheckBoxList1.DataBind();
        }
        else
        {
            var files = CheckBoxList1.Items.Cast<ListItem>()
                                                    .Where(li => li.Selected).Select(li => li.Value)
                                                    .ToList();
            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);
            Response.ContentType = "application/zip";
            Response.AddHeader("Content-Disposition", "attachment; filename=archive.zip");
            Response.TransmitFile(archive);
        }
    }

    protected void CheckBoxList1_DataBound(object sender, EventArgs e)
    {
        foreach (ListItem item in CheckBoxList1.Items)
        {
            item.Text = Path.GetFileName(item.Text);
        }
    }
}

از رویداد DataBound ازCheckBoxList برای تنظیم ویژگی Text هر آیتم استفاده کردم. از این ویژگی برای حذف مسیر کامل به فایل، استفاده کردم. اگر فرم post back شده ، آیتم های انتخابی در قالب یک List<string> ذخیره می شوند سپس کدی

مشابه برای حذف فایلهای پیشین، کپی فایلهای انتخابی به پوشه temp و تولید آرشیو zip، استفاده می شود. در نهایت، نوع محتوا و حالت پاسخ به درستی تنظیم شده و آرشیو به کلاینت ارسال می شود.

خلاصه

در این مقاله ی کوتاه در مورد چرایی غیرفعال بودن ارسال مجموعه فایل ها بحث شد و فقط با استفاده از کدهای فریمورک  .NET برای هردو سناریو ASP.NET MVC و Web Forms یک راه حل بیان شد.



مطالب مرتبط
ديدگاه خود را ارسال کنيد


محبوب ترين ويدئو هاي انلاين
دوره برنامه نویسی فروشگاه اینترنتی
  • تعداد اعضا 80k
  • قيمت دوره۱۰۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره آموزشی سیستم ثبت سفارش آنلاین
  • تعداد اعضا 80k
  • قيمت دوره۵۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره طراحی سیستم مدیریت مشتریان
  • تعداد اعضا 80k
  • قيمت دوره۵۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...