6

我试图通过 web 方法从服务器下载文件,但它对我不起作用。我的代码如下

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

我的ajax调用代码如下

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

我已经在按钮点击中调用了这个函数..

我不知道如何用其他方法下载文件

如果有其他方法可用,请建议我或在同一代码中进行更正。

谢谢大家..

4

3 回答 3

10

WebMethod 无法控制当前的响应流,因此不可能这样做。在您从 javascript 调用 Web 方法时,响应流已经传送到客户端,您对此无能为力。

执行此操作的一个选项是 WebMethod 将文件作为物理文件生成在服务器上的某个位置,然后将生成文件的 url 返回给调用 javascript,然后调用 javascriptwindow.open(...)来打开它。
除了生成物理文件之外,您还可以调用一些 GenerateFile.aspx,它执行您最初在 WebMethod 中尝试的操作,但在 中执行它Page_Load,并 window.open('GenerateFile.aspx?msg=From Clent')从 javascript 调用。

于 2012-08-23T07:54:21.657 回答
3

与其调用 Web 方法,不如使用通用处理程序(.ashx 文件)并将用于下载文件的代码放在处理程序的 ProcessRequest 方法中。

于 2012-08-24T10:09:19.880 回答
1

这是 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 () {

                }
            });
        });

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;
}
于 2014-10-30T15:35:54.590 回答