2013-04-07 2 views
12

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

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"); 
} 

ответ

15

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

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

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

+0

Да, это был весь смысл моего ответа. Если вы хотите, чтобы файл отображался в строке, вы ** не можете указать имя файла. Если вы показываете встроенный файл PDF, он открывается с помощью подключаемого на клиентской машине плагина для открытия PDF-файлов. Поведение будет варьироваться между различными плагинами. –

+0

@ Ответ Nalan M может заставить его скачать, в большинстве случаев. Поэтому нельзя сказать, что это невозможно. –

+0

Один вопрос, кто позаботится об утилизации здесь? – Legends

4

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

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

В моих действиях по экспорту в PDF данные возвращаются как ** обычный текст ** заменяя ** iframe ** вместо типа вложения. Мне пришлось добавить эти две строки, чтобы заставить его всплывать диалог сохранения. – OldTrain

0

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

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

URL, то тогда конец как этот

..PDFGenerator/Document2?docid=15