2013-08-28 22 views
31

Po kliknięciu przycisku użytkownik chce pobrać plik. Próbowałem następujące, które wydaje się działać, ale nie bez bez wyjątku (ThreadAbort), który jest nie do przyjęcia.Pobieranie pliku ASP.NET z serwera

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

można sprawdzić to podobne pytanie: http://stackoverflow.com/questions/2378204/context-response-end-and- Wątek został "przerwany" –

+3

'response.End()' powoduje "wyjątek ThreadAbortEx". –

+1

To jest błąd w środowisku .NET i został zgłoszony w wielu pytaniach SO. Złap ThreadAbort i gotowe. – debracey

Odpowiedz

64

Można użyć programu obsługi HTTP (.ashx), aby pobrać plik, tak:

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

Następnie można wywołać HTTP Handler z przycisku kliknij obsługi zdarzeń, takich jak to:

Markup:

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

Code-Behind:

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

Podjęcie parametr do Handler http:

Można po prostu dołączy zmienną string zapytanie do Response.Redirect(), tak:

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

Następnie w aktualnym kodzie obsługi można użyć obiektu Request n HttpContext aby pobrać wartość zmiennej ciąg kwerendy, na przykład:

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

// Use the yourVariableValue here 

Uwaga - powszechne jest przekazać nazwę pliku jako parametr łańcuch zapytania do zasugeruje użytkownikowi, co plik rzeczywiście jest, w którym mogą zastąpić tę wartość nazwy Save as ...

+0

Nice Solution drodzy! – John

+0

Czy możesz wyjaśnić, w jaki sposób możemy parametr do pobrania pliku ashx –

+0

@SagarMahajan - zobacz zaktualizowaną odpowiedź, jak korzystać z QueryString, aby uzyskać wartość parametru. –

5

Wypróbuj ten zestaw kodu, aby pobrać plik CSV z serwera.

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

To działało dla mnie, dzięki –

1

nawiązaniu do rozwiązania Karl Anderson, można umieścić swoje parametry do informacji o sesji, a następnie usunąć je po response.TransmitFile(Server.MapPath(Session(currentSessionItemName)));.

Aby uzyskać więcej informacji o sesjach, zobacz stronę MSDN na stronie 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

jeśli używasz formularza internetowego przycisk musi mieć wyzwalacz do odświeżenia strony – trifolius

2

Wprowadzanie zmian jak poniżej i przesunięcie od typu zawartości serwera jako

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

Ten pracował dla mnie.

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

Proste rozwiązanie do pobierania pliku z serwera:

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(); 
     }