我正在尝试下载从通过MVC应用程序中的网页输入的数据生成的excel文件。
此ajax调用在按下按钮时执行,并在我的控制器中调用两个方法。一种生成excel文件,另一种下载文件:
$.ajax({
type: 'POST',
data: myDataObject,
url: 'MyController/GenerateExcel/',
success: function(data) {
if (data.id != "") {
$http.get('MyController/DownloadExcel?id=' + encodeURIComponent(data.id) + '&name=' + encodeURIComponent(data.name));
return true;
}
}
});
这是我的POST方法,它生成excel文件并将其保存到TempData:
[HttpPost]
public JsonResult GenerateExcel(Object model)
{
var fileName = "myexcel.xlsx";
var fileID = Guid.NewGuid().ToString();
var generatedReport = GenerateCustomExcel(model);
using (MemoryStream memoryStream = new MemoryStream())
{
generatedReport.SaveAs(memoryStream);
generatedReport.Dispose();
memoryStream.Position = 0;
TempData[fileID] = memoryStream.ToArray();
}
return Json(new { id = fileID, name = fileName });
}
这是我的GET方法,可从TempData下载保存的Excel:
[HttpGet]
public FileResult DownloadExcel(string id, string name)
{
if (TempData[id] != null)
{
byte[] fileBytes = TempData[id] as byte[];
return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", name);
}
else
{
return null;
}
}
这在Google Chrome和Firefox浏览器中可以正常工作。但是,使用Internet Explorer或Microsoft Edge浏览器时,该文件拒绝下载。
调试控制台不会产生任何有用的错误。我尝试将返回的File类型更改为八位字节流,并使用window.location.href而不是get请求来下载文件,但是似乎没有任何效果。所有的函数都被调用,并且它们之间的数据正确传递,因此路由不是问题。
有人知道我如何下载返回的FileResult吗?
答案 0 :(得分:1)
这是一个解决方案。除了此处列出的更改之外,它使用的代码与我的问题相同。
将iframe元素添加到您的网页:
<iframe id="iFrameFileDownload" style="display: none;"></iframe>
在javascript中,而不是使用$ http.get()进行调用,而是将iframe元素的'src'属性设置为控制器函数url:
$.ajax({
type: 'POST',
data: myDataObject,
url: 'MyController/GenerateExcel/',
success: function(data) {
if (data.id != "") {
$("#iFrameFileDownload").attr("src", 'MyController/DownloadExcel?id=' + encodeURIComponent(data.id) + '&name=' + encodeURIComponent(data.name));
return true;
}
}
});
我考虑的另一个解决方案是使用window.open()函数而不是$ http.get()。 (来源:Download a file with mvc)但是,该解决方案使用弹出式窗口,并且要求用户在下载文件之前在浏览器中启用弹出式窗口。