从JQuery Ajax处理FileResult

mic*_*ael 7 javascript c# ajax asp.net-mvc jquery

我有一个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");
    }
Run Code Online (Sandbox Code Playgroud)

现在我希望能够下载结果(我不希望它在浏览器中打开)我通过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"
});
Run Code Online (Sandbox Code Playgroud)

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

Lee*_*ley 8

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

另一种方法是将文件保存在FinaliseQuoteaction方法中(并仅返回文件的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");
}
Run Code Online (Sandbox Code Playgroud)

JS:

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