2013-08-28 7 views
31

उपयोगकर्ता द्वारा एक बटन क्लिक करने के बाद, मैं एक फ़ाइल डाउनलोड करना चाहता हूं। मैंने निम्नलिखित काम करने की कोशिश की है जो काम करने लगता है, लेकिन एक अपवाद फेंकने के बिना नहीं (थ्रेडएबॉर्ट) जो स्वीकार्य नहीं है।सर्वर से ASP.NET फ़ाइल डाउनलोड

System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; 
    response.ClearContent(); 
    response.Clear(); 
    response.ContentType = "text/plain"; 
    response.AddHeader("Content-Disposition", "attachment; filename=" + fileName + ";"); 
    response.TransmitFile(Server.MapPath("FileDownload.csv")); 
    response.Flush(); 
    response.End(); 
+1

आप इस समान प्रश्न देख सकते हैं: http://stackoverflow.com/questions/2378204/context-response-end-and- थ्रेड-इत्यादि-निरस्त –

+3

'प्रतिक्रिया। अंत() '' थ्रेडएबॉर्ट अपवाद' का कारण बन रहा है। –

+1

यह .NET ढांचे में एक बग है और कई SO प्रश्नों में रिपोर्ट किया गया है। ThreadAbort पकड़ो और किया जाना चाहिए। – debracey

उत्तर

64

आप इस तरह, एक फाइल डाउनलोड करने के लिए एक HTTP हैंडलर (.ashx) का उपयोग कर सकते हैं:

DownloadFile.ashx:

public class DownloadFile : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; 
     response.ClearContent(); 
     response.Clear(); 
     response.ContentType = "text/plain"; 
     response.AddHeader("Content-Disposition", 
          "attachment; filename=" + fileName + ";"); 
     response.TransmitFile(Server.MapPath("FileDownload.csv")); 
     response.Flush();  
     response.End(); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

तो फिर तुम बटन से HTTP हैंडलर कॉल कर सकते हैं ईवेंट हैंडलर क्लिक करें, इस तरह:

मार्कअप:

<asp:Button ID="btnDownload" runat="server" Text="Download File" 
      OnClick="btnDownload_Click"/> 

कोड-पीछे:

protected void btnDownload_Click(object sender, EventArgs e) 
{ 
    Response.Redirect("PathToHttpHandler/DownloadFile.ashx"); 
} 

HTTP हैंडलर के लिए एक पैरामीटर पासिंग:

आप बस एक क्वेरी स्ट्रिंग चर Response.Redirect() करने के लिए, इस तरह संलग्न कर सकते हैं:

Response.Redirect("PathToHttpHandler/DownloadFile.ashx?yourVariable=yourValue"); 

फिर वास्तविक हैंडलर कोड में आप Request ऑब्जेक्ट का उपयोग कर सकते हैं I n HttpContext क्वेरी स्ट्रिंग चर मूल्य, इस तरह हड़पने के लिए:

System.Web.HttpRequest request = System.Web.HttpContext.Current.Request; 
string yourVariableValue = request.QueryString["yourVariable"]; 

// Use the yourVariableValue here 

नोट - यह जिसमें, के रूप में एक क्वेरी स्ट्रिंग पैरामीटर उपयोगकर्ता के लिए वास्तव में है क्या फ़ाइल सुझाव देने के लिए एक फ़ाइल नाम पारित करने के लिए आम बात है अगर वे उस नाम मान को ओवरराइड के साथ ओवरराइड कर सकते हैं ...

+0

अच्छा समाधान प्रिय! – John

+0

क्या आप समझा सकते हैं, हम पैरामीटर मान प्राप्त करने के लिए क्वेरी एशक्स –

+0

@ सागरमाहजन डाउनलोड करने के लिए पैरामीटर कैसे कर सकते हैं - पैरामीटर मान प्राप्त करने के लिए QueryString का उपयोग करने के लिए अद्यतन उत्तर देखें। –

5

सर्वर से CSV फ़ाइल डाउनलोड करने के लिए कोड के इस सेट को आज़माएं।

byte[] Content= File.ReadAllBytes(FilePath); //missing ; 
Response.ContentType = "text/csv"; 
Response.AddHeader("content-disposition", "attachment; filename=" + fileName + ".csv"); 
Response.BufferOutput = true; 
Response.OutputStream.Write(Content, 0, Content.Length); 
Response.End(); 
+0

यह मेरे लिए काम करता है, धन्यवाद –

1

कार्ल एंडरसन समाधान के लिए इसके अलावा, आप सत्र जानकारी में अपने मानकों को रखा और फिर response.TransmitFile(Server.MapPath(Session(currentSessionItemName))); के बाद उन्हें स्पष्ट कर सकते हैं।

सत्रों के बारे में अधिक जानकारी के लिए एमएसडीएन पृष्ठ HttpSessionState.Add Method (String, Object) देखें।

0
protected void DescargarArchivo(string strRuta, string strFile) 
{ 
    FileInfo ObjArchivo = new System.IO.FileInfo(strRuta); 
    Response.Clear(); 
    Response.AddHeader("Content-Disposition", "attachment; filename=" + strFile); 
    Response.AddHeader("Content-Length", ObjArchivo.Length.ToString()); 
    Response.ContentType = "application/pdf"; 
    Response.WriteFile(ObjArchivo.FullName); 
    Response.End(); 


} 
+0

यदि आप वेब फॉर्म का उपयोग करते हैं तो बटन को पोस्टबैक के लिए ट्रिगर होना चाहिए – trifolius

2

नीचे के रूप में परिवर्तन करना और के रूप में

Response.ContentType = "application/octet-stream"; 

यह मेरे लिए काम किया सर्वर सामग्री प्रकार पर redeploying।

Response.Clear(); 
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); 
Response.AddHeader("Content-Length", file.Length.ToString()); 
Response.ContentType = "application/octet-stream"; 
Response.WriteFile(file.FullName); 
Response.End(); 
0

सर्वर से एक फ़ाइल डाउनलोड करने के लिए सरल समाधान:

protected void btnDownload_Click(object sender, EventArgs e) 
     { 
      string FileName = "Durgesh.jpg"; // It's a file name displayed on downloaded file on client side. 

      System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; 
      response.ClearContent(); 
      response.Clear(); 
      response.ContentType = "image/jpeg"; 
      response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";"); 
      response.TransmitFile(Server.MapPath("~/File/001.jpg")); 
      response.Flush(); 
      response.End(); 
     } 
संबंधित मुद्दे