web-dev-qa-db-fra.com

Téléchargement de fichier ASP.NET à partir du serveur

Après qu'un utilisateur clique sur un bouton, je veux qu'un fichier soit téléchargé. J'ai essayé ce qui suit qui semble fonctionner, mais pas sans lancer une exception (ThreadAbort) qui n'est pas acceptable.

    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();  
37
James Stevenson

Vous pouvez utiliser un gestionnaire HTTP (.ashx) pour télécharger un fichier, comme ceci:

TéléchargerFichier.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;
        }
    }
}

Ensuite, vous pouvez appeler le gestionnaire HTTP à partir du gestionnaire d'événements de clic de bouton, comme suit:

Balisage:

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

Code-Derrière:

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

Passage d'un paramètre au gestionnaire HTTP:

Vous pouvez simplement ajouter une variable de chaîne de requête à la Response.Redirect(), comme ceci:

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

Ensuite, dans le code du gestionnaire actuel, vous pouvez utiliser l'objet Request dans HttpContext pour récupérer la valeur de la variable de chaîne de requête, comme ceci:

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

// Use the yourVariableValue here

Remarque - il est courant de transmettre un nom de fichier en tant que paramètre de chaîne de requête pour suggérer à l'utilisateur ce qu'est réellement le fichier. Dans ce cas, ils peuvent remplacer la valeur de ce nom par Enregistrer sous ...

73
Karl Anderson

Essayez cet ensemble de code pour télécharger un fichier CSV à partir du serveur.

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();
7
Robin Joseph

Effectuer les modifications comme ci-dessous et redéployer sur le type de contenu du serveur comme 

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

Cela a fonctionné pour moi. 

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();
2
AMIT KUMAR SHARMA

Suite à la solution de Karl Anderson, vous pouvez mettre vos paramètres dans les informations de session puis les effacer après response.TransmitFile(Server.MapPath( Session(currentSessionItemName)));.

Consultez la page MSDN HttpSessionState.Add, méthode (String, Object) pour plus d'informations sur les sessions.

1
user3996687

Solution simple pour télécharger un fichier depuis le serveur:

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