最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Handling FileResult from JQuery Ajax - Stack Overflow

programmeradmin3浏览0评论

I have a MVC C# Controller that returns a FileResult

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

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

Now I want to be able to download the result (I don't want it to open up in the browser) I am calling the controller via $.ajax method in JavaScript

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"
});

How do I handle the data to force it to download?

I have a MVC C# Controller that returns a FileResult

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

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

Now I want to be able to download the result (I don't want it to open up in the browser) I am calling the controller via $.ajax method in JavaScript

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"
});

How do I handle the data to force it to download?

Share Improve this question edited Jun 10, 2015 at 3:38 ekad 14.6k26 gold badges46 silver badges48 bronze badges asked Jun 5, 2015 at 8:22 MichaelMichael 8,73921 gold badges66 silver badges115 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 10

You won't be able to use JavaScript to save the file to disk as this is blocked for security reasons.

An alternative would be to save the file in the FinaliseQuote action method (and return just an id for the file), then create another action method that responds to a GET request and returns the file. In your success function you then set window.location.href to point to your new action method (you'll need to pass an id for the file). Also make sure you set the MIME type to application/octet-stream and that should force the browser to download the file.

Controller:

[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;
},
发布评论

评论列表(0)

  1. 暂无评论