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

با آموزش دانلود چند فایل هم زمان در 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  فرستاده می شوند:

 

فایلها ،در مجموعه ای از checkbox ها و به صورت فرم، لیست شده اند:

 

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

 

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

 

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

Web Forms

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

 

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

 

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

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

خلاصه

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

 

دانلود چند فایل هم زمان در ASP.NET
4.5 (90%) 2 رایs

(434 نوشته)

C# Programmer , Web Design And Developer , MVC , ASP.NET

فکر شما چیست؟

آدرس ایمیل شما منتشر نخواهد شد. بخشهای موردنیاز علامتگذاری شدهاند *

حاصل جمع اعداد را وارد کنید : *