Я пытаюсь загрузить файл Excel, сгенерированный из данных, введенных через веб-страницу в приложении MVC.
Этот 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, который загружает сохраненный файл Excel из TempData:
[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 файл не загружается.
Консоль отладки не выдает никаких полезных ошибок. Я попытался изменить возвращаемый тип файла на поток октетов и использовать window.location.href вместо запроса get для загрузки файла, но ничего не работает. Все функции вызываются и данные передаются между ними правильно, поэтому маршруты не являются проблемой.
Кто-нибудь знает, как я могу сделать возвращенную загрузку FileResult?