ASP.NET MVC FileStreamResult, fileDownloadName не используется

Следующее возвращает PDF, который браузер пытается отобразить в строке. Это работает правильно. Однако, если я попытаюсь загрузить файл, имя загрузки не будет "myPDF.pdf", а вместо этого ID на маршруте (myapp/controller/PDFGenerator/ID). Можно ли установить имя загрузки файла как "myPDF.pdf"?

public FileStreamResult PDFGenerator(int id)
{
    MemoryStream ms = GeneratePDF(id);

    byte[] file = ms.ToArray();
    MemoryStream output = new MemoryStream();
    output.Write(file, 0, file.Length);
    output.Position = 0;
    HttpContext.Response.AddHeader("content-disposition", 
    "inline; filename=myPDF.pdf");

    return File(output, "application/pdf", fileDownloadName="myPDF.pdf");
}

Ответ 1

Нет, это невозможно, если PDF файл отображается в строке. Вы можете достичь этого, если вы отправляете заголовок Content-Disposition с вложением:

public ActionResult PDFGenerator(int id)
{
    Stream stream = GeneratePDF(id);
    return File(stream, "application/pdf", "myPDF.pdf");
}

Также обратите внимание на то, как я удалил ненужный MemoryStream, который вы использовали и загружал PDF в память, где вы могли напрямую передать его клиенту, что было бы намного более эффективным.

Ответ 2

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

Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment; filename=FileName.pdf");

Ответ 3

Можно сделать id строкой, которая представляет имя файла без расширения.

public ActionResult PDFGenerator(string id, int? docid)
{
    Stream stream = GeneratePDF(docid);
    return new FileStreamResult(stream , "application/pdf");
}

Затем URL-адрес заканчивается следующим образом

  ..PDFGenerator/Document2?docid=15