我有一个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"
});
如何处理数据以强制下载?
答案 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;
},