Объект ответа не реализует файл для загрузки в ASP.NET MVC framework - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь скачать файл. Кажется, все в порядке, не исключение.

Я вызываю контроллер действий из внешнего интерфейса с помощью простого вызова jQuery $.ajax.

Что не так с моим кодом?

MemoryStream ms = new MemoryStream();
TextWriter tw = new StreamWriter(ms);
tw.WriteLine("Line 1");
tw.WriteLine("Line 2");
tw.WriteLine("Line 3");
tw.Flush();
byte[] bytes = ms.ToArray();
ms.Close();

Response.Clear();
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", "attachment; filename= YourFileName.txt");
Response.BinaryWrite(bytes);
Response.End();

return Json(resultado, JsonRequestBehavior.AllowGet);

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Первое, что вы должны знать: вы не можете напрямую вернуть файл из обратного вызова 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();
    }
}

Если вы делаете все это правильно, текстовый файл должен быть в состоянии загрузить.

0 голосов
/ 04 сентября 2018

Измените свой код на этот, и он должен работать.

MemoryStream ms = new MemoryStream();
TextWriter tw = new StreamWriter(ms);
tw.WriteLine("Line 1");
tw.WriteLine("Line 2");
tw.WriteLine("Line 3");
tw.Flush();
byte[] bytes = ms.ToArray();
ms.Close();

return File(bytes, "text/plain", "YourFileName.txt");

если в каком-либо браузере текстовый файл открывается автоматически, чем вы можете попробовать, взломать тип контента "application / octet-stream" ... итак, последняя строка должна выглядеть так:

return File(bytes, "application/octet-stream", "YourFileName.txt");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...