2011-12-21 9 views
18

Desidero che il browser scarichi un documento PDF dal server invece di aprire il file nel browser stesso. Sto usando C#.Forza il browser per scaricare il documento PDF invece di aprirlo

Di seguito è riportato il codice di esempio che ho utilizzato. Non funziona ..

string filename = "Sample server url"; 
response.redirect(filename); 
+0

Perché no? Che succede? Qual è l'URL attuale? – SLaks

+0

@SLaks .. grazie per reply..it si apre in un'altra scheda nel browser. non scaricare. – Arun

risposta

29

Si dovrebbe guardare l'intestazione "Content-Disposition"; ad esempio l'impostazione di "Content-Disposition" su "attachment; filename = foo.pdf" richiederà all'utente (in genere) una finestra di dialogo "Salva come: foo.pdf", anziché aprirla. Questo, tuttavia, deve venire dalla richiesta che è facendo il download, quindi non è possibile farlo durante un reindirizzamento. Tuttavia, ASP.NET offre Response.TransmitFile per questo scopo. Per esempio (supponendo che non si utilizza MVC, che ha altre opzioni preferite):

Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.AppendHeader("Content-Disposition", "attachment; filename=foo.pdf"); 
Response.TransmitFile(filePath); 
Response.End(); 
+0

grazie per la risposta ... se do un url invece di foo.pdf nella tua risposta funzionerà ...? – Arun

+0

@Neon no; devi effettivamente trasmettere i contenuti se lo fai; 'TransmitFile' prende un percorso file * local *, IIRC. –

+0

@Neon per chiarire - se l'URL è da qualche altra parte, potresti agire come * proxy * per quell'URL; ma non puoi dire "vai a prendere il file da [lì] e trattalo come download" - il server che fornisce il contenuto finale può scegliere il tipo di contenuto e la disposizione. –

4

Se si desidera rendere il file (s) in modo che si potrebbe salvarli a vostra fine invece di aprire nel browser , si può provare il seguente frammento di codice:

Tuttavia, se volete scaricare il file utilizzando un'applicazione client allora si dovrà utilizzare il WebClient class.

+0

grazie per la risposta ... proverò il tuo codice e dirò il mio feedback .. – Arun

+0

ottengo "Argument Out Of Range Exception" durante l'esecuzione nella riga Response.BinaryWrite (outStream.ToArray()); – Arun

+0

Hai riempito il contenuto dell'outstream? Leggi il tuo file nel flusso di memoria e spero che funzionerà bene. –

0

Sono quasi lo stesso nella maggior parte dei casi, ma c'è una differenza:

Aggiungi intestazione sostituirà la voce precedente con la stessa chiave

intestazione Aggiungi non sostituirà la chiave, piuttosto si aggiungerà un altro uno.

2

Io uso questo impostando il parametro inline su true che verrà visualizzato nel browser false mostrerà Salva come finestra di dialogo nel browser.

public void ExportReport(XtraReport report, string fileName, string fileType, bool inline) 
{ 
    MemoryStream stream = new MemoryStream(); 

    Response.Clear(); 

    if (fileType == "xls") 
     report.ExportToXls(stream); 
    if (fileType == "pdf") 
     report.ExportToPdf(stream); 
    if (fileType == "rtf") 
     report.ExportToRtf(stream); 
    if (fileType == "csv") 
     report.ExportToCsv(stream); 

    Response.ContentType = "application/" + fileType; 
    Response.AddHeader("Accept-Header", stream.Length.ToString()); 
    Response.AddHeader("Content-Disposition", String.Format("{0}; filename={1}.{2}", (inline ? "Inline" : "Attachment"), fileName, fileType)); 
    Response.AddHeader("Content-Length", stream.Length.ToString()); 
    //Response.ContentEncoding = System.Text.Encoding.Default; 
    Response.BinaryWrite(stream.ToArray()); 

    Response.End(); 
} 
Problemi correlati