web-dev-qa-db-fra.com

Forcer le navigateur à télécharger PDF document au lieu de l'ouvrir

Je souhaite que le navigateur télécharge un document PDF à partir du serveur au lieu d'ouvrir le fichier dans le navigateur même. J'utilise C #.

Vous trouverez ci-dessous mon exemple de code que j'ai utilisé. Ça ne marche pas ..

string filename = "Sample server url";
response.redirect(filename);
20
Arun

Vous devriez regarder l'en-tête "Content-Disposition"; Par exemple, définir "Content-Disposition" sur "attachment; nomfichier = foo.pdf" invitera l'utilisateur (généralement) avec une boîte de dialogue "Enregistrer sous: foo.pdf" plutôt que de l'ouvrir. Ceci, cependant, doit provenir de la requête effectuant le téléchargement, vous ne pouvez donc pas le faire pendant une redirection. ASP.NET propose toutefois Response.TransmitFile à cette fin. Par exemple (en supposant que vous n'utilisez pas MVC, qui a d'autres options préférées):

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

Si vous souhaitez rendre le (s) fichier (s) de manière à pouvoir les enregistrer de votre côté au lieu de les ouvrir dans le navigateur, vous pouvez essayer l'extrait de code suivant:

//create new MemoryStream object and add PDF file’s content to outStream.
MemoryStream outStream = new MemoryStream();

//specify the duration of time before a page cached on a browser expires
Response.Expires = 0;

//specify the property to buffer the output page
Response.Buffer = true;

//erase any buffered HTML output
Response.ClearContent();

//add a new HTML header and value to the Response sent to the client
Response.AddHeader(“content-disposition”, “inline; filename=” + “output.pdf”);

//specify the HTTP content type for Response as Pdf
Response.ContentType = “application/pdf”;

//write specified information of current HTTP output to Byte array
Response.BinaryWrite(outStream.ToArray());

//close the output stream
outStream.Close();

//end the processing of the current page to ensure that no other HTML content is sent
Response.End();

Toutefois, si vous souhaitez télécharger le fichier à l'aide d'une application client, vous devez utiliser la classe WebClient

4
Shahzad Latif

J'utilise ce paramètre en définissant le paramètre inline sur true. Il apparaîtra dans le navigateur. False, il sera affiché dans le navigateur.

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();
}
3
allanmunroza

Ils sont presque identiques dans la plupart des cas, mais il y a une différence: 

Ajouter en-tête remplacera l'entrée précédente par la même clé

L'ajout d'en-tête ne remplacera pas la clé, mais en ajoutera une autre. 

0
Ahmed Siddiqui