如何从ajax调用下载文件并强制下载结果

时间:2016-12-20 13:18:38

标签: asp.net-mvc file download asp.net-ajax

我昨天发布了类似的问题,但我还没有得到结果。我已经在我的kendo网格上加载数据了 点击下载,我想下载文件,但它没有返回结果。我正在下载的文件夹是在服务器上而不是在项目解决方案上。 我创建了一个控制器来测试下载而无需单击按钮,它可以工作,但我想从kendo按钮单击下载。控制台上没有错误

从网格中获取所选ID的功能

 function showDetails(e) {
               e.preventDefault();
               var dataItem = this.dataItem($(e.currentTarget).closest("tr"));

               DownloadIndexController(dataItem.possID);
               }

Ajax调用控制器

function DownloadIndexController(possID) {
                $.ajax({
                    url: '@Url.Action("DownloadIndex", "Poss")',
                    type: "GET",
                    data: { possID: possID },
                    dataType: "json",
                    success: function (data) {
                        window.location = '@Url.Action("DownloadIndex", "Poss")';
                    }
                })
            }

控制器

public ActionResult DownloadIndex(int possID)
    {
        string Filelocation = "myserverlocation"
        FileContentResult ff = null;
        try
        {
            OnePossModel md = new Models.OnePossModel();
            JsonParamBuilder myBuilder = new JsonParamBuilder();
            myBuilder.AddParam<Guid>("submittingUserID", System.Guid.Parse(User.Identity.GetUserId()));
            myBuilder.AddParam<int>("possID", Convert.ToInt32(possID));

            string jsonReq = Models.JsonWrapper.JsonPOST(ApiBaseUrl + ApiPOSSSubBaseUrl + "/WritePOSSFile", myBuilder.GetJSonParam());
            string possFilename = Models.DeserialiseFromJson<string>.DeserialiseApiResponse(jsonReq);

            possFilename = possFilename.Replace(",", ",");

            string x = Filelocation + possFilename.ToString();

            var type = System.Net.Mime.MediaTypeNames.Application.Octet;

            byte[] fileBytes = System.IO.File.ReadAllBytes(x);
            string myfileName = possFilename;
            ff =  File(fileBytes, type,myfileName);
            Response.AppendHeader("Content-Disposition", "attachment; filename=" + myfileName);
            Response.BinaryWrite(fileBytes);
            return ff;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }               

2 个答案:

答案 0 :(得分:0)

在你的控制器中,只需添加:

public FileResult DownloadIndex(int possID)
{
    . . . .
    return File(fileBytes, type,myfileName);
}

答案 1 :(得分:0)

我认为不能按照你想要的方式完成。看看here的解决方法,以模拟“ajax文件下载”。

在您的代码中,您正在发出2个请求,第一个创建文件并在响应中流式传输(并且无法使用ajax下载),然后通过设置window.location来设置第二个请求 - 但文件不是“ “因为它被分配给了第一个回复,所以还活着。”

如果使用FileResult操作然后放弃ajax调用(取决于您的要求),只需使用普通链接:/poss/downloadindex/123