Spécification du nom de fichier pour le PDF dynamique dans asp.net
Question
Comment puis-je spécifier le nom du fichier lors du vidage des données dans le flux de réponses?
En ce moment, je fais ce qui suit:
byte[] data= GetFoo();
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/pdf";
Response.BinaryWrite(data);
Response.End();
Avec le code ci-dessus, j'obtiens "foo.aspx.pdf". comme nom de fichier à sauvegarder. Je semble me souvenir d’avoir pu ajouter un en-tête à la réponse pour spécifier le nom du fichier à enregistrer.
La solution
Ajoutez une disposition de contenu à l'en-tête:
Response.AddHeader("content-disposition", @"attachment;filename=""MyFile.pdf""");
Autres conseils
Pour info ... si vous utilisez " inline " au lieu de " pièce jointe " le fichier s'ouvrira automatiquement dans IE. Au lieu d’inviter l’utilisateur par un dialogue Ouvrir / Enregistrer.
Response.AppendHeader("content-disposition", string.Format("inline;FileName=\"{0}\"", fileName));
Response.AppendHeader("Content-Disposition", "attachment; filename=foo.pdf");
Pour une raison quelconque, la plupart des réponses ne semblent même pas tenter de coder la valeur du nom de fichier. Si le fichier contient des espaces, des points-virgules ou des guillemets, il risque de ne pas apparaître correctement.
Il semble que vous puissiez utiliser le ContentDisposition
classe pour générer une valeur d’en-tête correcte:
Response.AppendHeader("Content-Disposition", new ContentDisposition
{
FileName = yourFilename
}.ToString());
Vous pouvez consulter le code source de ContentDisposition.ToString ()
pour confirmer qu'il essaie de l'encoder correctement.
Avertissement : cela semble se bloquer lorsque le nom du fichier contient un tiret (pas un trait d'union). Je n'ai pas encore pris la peine d'examiner cela.
Response.AddHeader("Content-Disposition", "attachment;filename=" & FileName & ";")