6 votes

Télécharger un fichier depuis C# par une méthode Web via un appel Ajax ?

J'ai essayé de télécharger le fichier depuis le serveur par la méthode Web. mais cela n'a pas fonctionné pour moi. Mon code est le suivant

     [System.Web.Services.WebMethod()]
public static string GetServerDateTime(string msg)
{
    String result = "Result : " + DateTime.Now.ToString() + " - From Server";
    System.IO.FileInfo file = new System.IO.FileInfo(System.Web.HttpContext.Current.Server.MapPath(System.Configuration.ConfigurationManager.AppSettings["FolderPath"].ToString()) + "\\" + "Default.aspx");
    System.Web.HttpResponse Response = System.Web.HttpContext.Current.Response;
    Response.ClearContent();
    Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
    Response.AddHeader("Content-Length", file.Length.ToString());
    Response.ContentType = "application/octet-stream";
    Response.WriteFile(file.FullName);
    //HttpContext.Current.ApplicationInstance.CompleteRequest();
    Response.Flush();
    Response.End();
    return result;        
}

et mon code d'appel ajax est le suivant

    <script type="text/javascript">
    function GetDateTime() {
                    var params = "{'msg':'From Client'}";
                    $.ajax
                      ({
                          type: "POST",
                          url: "Default.aspx/GetServerDateTime",
                          data: params,
                          contentType: "application/json;charset=utf-8",
                          dataType: "json",
                          success: function (result) {
                              alert(result.d);
                          },
                          error: function (err) {

                          }
                      });
    }
</script>

et j'ai appelé cette fonction dans le clic du bouton

je ne sais pas comment télécharger le fichier avec d'autres méthodes

Veuillez me suggérer si d'autres méthodes sont disponibles ou me donner la correction dans le même code.

Merci à tous

10voto

awe Points 9697

Une WebMethod n'a pas le contrôle du flux de réponses en cours, il n'est donc pas possible de procéder de cette manière. Au moment où vous appelez une méthode Web à partir de javascript, le flux de réponses est déjà livré au client, et vous ne pouvez rien y faire.

Une option pour faire cela est que le WebMethod génère le fichier comme un fichier physique quelque part sur le serveur, et renvoie ensuite l'url du fichier généré au javascript appelant, qui utilise à son tour window.open(...) pour l'ouvrir.
Au lieu de générer un fichier physique, vous pouvez appeler un GenerateFile.aspx qui fait à peu près ce que vous avez essayé de faire initialement dans votre WebMethod, mais en le faisant dans le format Page_Load et appeler window.open('GenerateFile.aspx?msg=From Clent') à partir de javascript.

3voto

Ben Points 273

Au lieu d'appeler une méthode Web, il serait préférable d'utiliser un gestionnaire générique (fichier .ashx) et de placer votre code de téléchargement du fichier dans la méthode ProcessRequest du gestionnaire.

1voto

Ziyad Godil Points 1177

C'est l'appel Ajax

             $(".Download").bind("click", function () 
             {
                var CommentId = $(this).attr("data-id");
                $.ajax({
                   type: "POST",
                   contentType: "application/json; charset=utf-8",
                   url: "TaskComment.aspx/DownloadDoc",
                   data: "{'id':'" + CommentId + "'}",
                   success: function (data) {

                   },
                   complete: function () {

                }
            });
        });

Le code derrière C#

   [System.Web.Services.WebMethod]
   public static string DownloadDoc(string id)
   {
       string jsonStringList = "";
       try
       {
        int CommentId = Convert.ToInt32(id);
        TaskManagemtEntities contextDB = new TaskManagementEntities();
        var FileDetail = contextDB.tblFile.Where(x => x.CommentId == CommentId).FirstOrDefault();
        string fileName = FileDetail.FileName;
        System.IO.FileStream fs = null;
        string path = HostingEnvironment.ApplicationPhysicalPath + "/PostFiles/" + fileName;
        fs = System.IO.File.Open(path + fileName, System.IO.FileMode.Open);
        byte[] btFile = new byte[fs.Length];
        fs.Read(btFile, 0, Convert.ToInt32(fs.Length));
        fs.Close();
        HttpContext.Current.Response.AddHeader("Content-disposition", "attachment; filename=" + fileName);
        HttpContext.Current.Response.ContentType = "application/octet-stream";
        HttpContext.Current.Response.BinaryWrite(btFile);
        HttpContext.Current.Response.End();
        fs = null;
        //jsonStringList = new JavaScriptSerializer().Serialize(PendingTasks);
    }
    catch (Exception ex)
    {

    }
    return jsonStringList;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X