从JQuery Ajax处理FileResult

时间:2015-06-05 08:22:33

标签: javascript c# jquery ajax asp.net-mvc

我有一个MVC C#Controller,它返回一个FileResult

    [HttpPost]
    public FileResult FinaliseQuote(string quote)
    {
        var finalisedQuote = JsonConvert.DeserializeObject<FinalisedQuote>(System.Uri.UnescapeDataString(quote));

        return File(finalisedQuote.ConvertToPdf(), "application/pdf");
    }

现在我希望能够下载结果(我不希望它在浏览器中打开) 我通过JavaScript中的$ .ajax方法调用控制器

var postData = { quote: finalisedQuote };

var url = "/NewQuote/FinaliseQuote";

$.ajax({
    type: "POST",
    url: url,
    data: postData,
    success: function (data) {
        //how do I handle data to force download
    },
    fail: function (msg) {
        alert(msg)
    },
    datatype: "json"
});

如何处理数据以强制下载?

1 个答案:

答案 0 :(得分:7)

您无法使用JavaScript将文件保存到磁盘,因为出于安全原因会阻止该文件。

另一种方法是将文件保存在FinaliseQuote操作方法中(并仅返回文件的id),然后创建另一个响应GET请求并返回文件的操作方法。在您的成功功能中,您可以将window.location.href设置为指向您的新操作方法(您需要为该文件传递ID)。另外,请确保将MIME类型设置为application/octet-stream,这应该强制浏览器下载文件。

<强>控制器:

[HttpPost]
public JsonResult FinaliseQuote(string quote)
{
    var finalisedQuote = JsonConvert.DeserializeObject<FinalisedQuote>(System.Uri.UnescapeDataString(quote));

    // save the file and return an id...
}

public FileResult DownloadFile(int id)
{
    var fs = System.IO.File.OpenRead(Server.MapPath(string.Format("~/Content/file{0}.pdf", id)));

    // this is needed for IE to save the file instead of opening it
    HttpContext.Response.Headers.Add("Content-Disposition", "attachment; filename=\"filename\""); 

    return File(fs, "application/octet-stream");
}

<强> JS:

success: function (data) {
    window.location.href = "/NewQuote/DownloadFile?id=" + data;
},