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