2013-04-07 16 views
12

Quanto segue restituisce un PDF che il browser tenta di visualizzare direttamente in linea. Funziona correttamente Tuttavia, se provo a scaricare il file, il nome del download non è "myPDF.pdf", ma piuttosto l'ID nella route (myapp/controller/PDFGenerator/ID). È possibile impostare il nome del download del file come "myPDF.pdf"?ASP.NET MVC FileStreamResult, fileDownloadName non viene utilizzato

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

risposta

15

No, questo non è possibile con un PDF visualizzato in linea. Si potrebbe raggiungere questo obiettivo se si invia l'intestazione Content-Disposition con in allegato:

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

Si noti inoltre come ho tolto il superfluo MemoryStream si stava utilizzando e caricare il PDF in memoria in cui si potrebbe avere direttamente in streaming al cliente che sarebbe stato molto più efficiente.

+0

Sì, che era il punto della mia risposta. Se vuoi che il file sia visualizzato in linea, ** non puoi ** specificare un nome file. Se si visualizza il file PDF in linea, viene aperto con il plug-in associato al computer client per aprire i file PDF. Il comportamento varierà tra i vari plug-in. –

+0

@Nalan M risposta potrebbe costringerlo a scaricare, nella maggior parte dei casi. Quindi, non dovrebbe essere detto come non possibile. –

+0

Una domanda, chi si occupa di smaltire lo stream qui? – Legends

4

Se si utilizza FileStreamResult di scaricare il file, provare a utilizzare questo controller

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

Sulla mia esportazione in PDF azioni restituisce i dati come ** testo normale ** sostituendo ** iframe ** al posto del tipo di allegato. Ho dovuto aggiungere queste due righe per costringerlo a visualizzare la finestra di salvataggio. – OldTrain

0

E 'possibile realizzando l'id di una stringa che rappresenta il nome del file senza l'estensione.

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

L'url quindi poi finire così

..PDFGenerator/Document2?docid=15 
Problemi correlati