دانلود فایل با استفاده از #C درASP

چهارشنبه 6 مرداد 1395

در این مقاله ، میخواهیم شما را با نحوه دانلود فایل درASP.NET توسط Generic Handler اشنا کنیم و نحوه دانلود فایل از سرور را مورد بررسی قرار میدهیم.

دانلود فایل با استفاده از #C درASP

 یک generic handler برای انجام همه لود کردن های سنگین خواهیم ساخت. در این روش کد میتواند  هر موقع و هر جایی که لازم باشد ، دوباره مورد استفاده قرار گیرد .

به طور معمول ما توصیه میکنیم، یک وب سایت جدید برای این کار بسازیم.

از این جهت visual studio را باز میکنیم ویک صفحه ASP.NET Website جدید میسازیم.(File>New>Website)یا(Shift +Alt+N).

در وب سایت جدید نیاز به اضافه کردن یک generic handler داریم بنابراین میرویم به
website > add new item) or (Ctrl + Shift + A)).
 

generic handler را از لیست انتخاب میکنیم و  download.ashx نامگذاری میکنیم .

visual studio توسط generic handler چند کار سخت را برای شما انجام خواهد داد.

 

<%@ WebHandler Language="C#" Class="Download" %>  
  
using System;  
using System.Web;  
  
public class Download : IHttpHandler {  
      
    public void ProcessRequest (HttpContext context) {  
        context.Response.ContentType = "text/plain";  
        context.Response.Write("Hello World");  
    }  
   
    public bool IsReusable {  
        get {  
            return false;  
        }  
    }  
  
} 

در داخل بخش مربوط به پردازش کد تولید شده، نیاز داریم تا محتویات فعلی را حذف کنیم، به عنوان مثال :

context.Response.ContentType = "text/plain"; context.Response.Write("Hello World");

هنگامی که یکبار این خط هارا پاک کردید،کد های زیر را اضافه کنید:

 

    string file = context.Request.QueryString["file"];  
      
    if (!string.IsNullOrEmpty(file) && File.Exists(context.Server.MapPath(file)))  
    {  
        context.Response.Clear();  
        context.Response.ContentType = "application/octet-stream";  
        context.Response.AddHeader("content-disposition", "attachment;filename=" + Path.GetFileName(file));  
        context.Response.WriteFile(context.Server.MapPath(file));  
        // This would be the ideal spot to collect some download statistics and / or tracking  
        // also, you could implement other requests, such as delete the file after download  
        context.Response.End();          
      
    }  
    else  
    {  
        context.Response.ContentType = "text/plain";  
        context.Response.Write("File not be found!");  
              
      
    }

 

این کد چه کاری انحام میدهد؟ابتدا  یک رشته از مقدار query string میسازد که فایلی است که توسط کاربر دانلود می شود.

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

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

در ادامه ما نوع متن را بر روی  ‘application/octet-stream’ تنظیم می کنیم که یک باینری فایل است.

با استفاده از این روش، انواع فایل ها پوشش داده میشوند.

سپس خط بعدی را بررسی می کنیم:

AddHeader(("content-disposition", "attachment;filename=" + Path.GetFileName(file)) 

این خط کد به کاربر اجازه میدهد فایل را در کامپیوتر خودش ذخیره کند و سپس تصمیم بگیرد چگونه از ان استفاده کند،و تصمیم گیری برای استفاده از فایل را بر عهده مرورگر نمی گذارد. سپس ما فایل را مینویسیم و ()Response.End را صدا میزنیم. که همه ی  خروجی buffer را به client ارسال میکند، اجرای صفحه را متوقف میکند  و System.Web.HttpApplication.EndRequest event. را اجرا میکند.

برای استفاده از generic handler  که قبلا ایجاد کردیم ; شما نیاز دارید لینک زیر را در صفحه ی Webform اضافه کنید.

به عنوان نمونه:

<a href="Download.ashx?file=images/cat1.jpg">cat pic</a>

 

شما میتوانید لینک خودتان را در فایل download.ashx که با یک query string نشان میدهد،کدام فایل کاربر دانلود شده است، ببینید.در اینجا یک عکس به نام cat1.jpg که در یک فولدر به نام images وجود دارد. برای پیاده سازی و کد میتواند مجددا مورد استفاده قرار گیرد.

 

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


 



 

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

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

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

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

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