Первое, что вы должны знать: вы не можете напрямую вернуть файл из обратного вызова AJAX, даже если он использует Response
экземпляр. Однако вы можете вернуть строку, содержащую имя файла, и сохранить содержимое файла в виде байтового массива внутри TempData
или Session
:
[HttpPost]
public ActionResult ActionName(...)
{
byte[] bytes;
// other logic here
using (var ms = new MemoryStream())
{
TextWriter tw = new StreamWriter(ms);
tw.WriteLine("Line 1");
tw.WriteLine("Line 2");
tw.WriteLine("Line 3");
tw.Flush();
bytes = ms.ToArray();
}
TempData["bytes"] = bytes; // add this line
return Json(new { fileName = "YourFileName.txt" });
}
Далее, обработайте success
часть вызова AJAX с window.location
или window.location.href
, установленным на URL, который указывает на имя действия, которое будет загружать файл:
$.ajax({
type: 'POST',
url: '@Url.Action("ActionName", "ControllerName")',
data: ...,
success: function(result) {
window.location = '@Url.Action("DownloadFile", "ControllerName")' + '?fileName=' + result.fileName;
}
});
Наконец, создайте контроллер с методом HTTP GET и используйте массив байтов, ранее сохраненный внутри TempData
/ Session
, для возврата FileResult
:
[HttpGet]
public FileResult DownloadFile(string fileName)
{
if (TempData["bytes"] != null)
{
var content = TempData["bytes"] as byte[];
return File(content, "application/octet-stream", fileName);
}
else
{
return new EmptyResult();
}
}
Если вы делаете все это правильно, текстовый файл должен быть в состоянии загрузить.