2008-09-16 9 views
31

Comment puis-je spécifier le nom de fichier lors du transfert de données dans le flux de réponse?Spécification d'un nom de fichier pour PDF dynamique dans asp.net

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, je reçois « foo.aspx.pdf » comme nom de fichier pour enregistrer. Je me souviens d'avoir pu ajouter un en-tête à la réponse pour spécifier le nom de fichier à sauvegarder.

Répondre

53

Ajouter une disposition de contenu à l'en-tête:

Response.AddHeader("content-disposition", @"attachment;filename=""MyFile.pdf"""); 
+3

Les guillemets doubles doivent être placés autour du nom de fichier. Voir http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download –

15
Response.AppendHeader("Content-Disposition", "attachment; filename=foo.pdf"); 
+4

Si quelqu'un se demande pourquoi il existe à la fois 'AddHeader' et' AppendHeader', [ne vous demandez plus ...] (http://msdn.microsoft.com/en-us/library/system.web.httpresponse. addheader.aspx) –

+0

http://stackoverflow.com/a/5648407/672244 – idok

+0

comment faire ce nom de fichier en tant que dynamique Response.AppendHeader ("Content-Disposition", "pièce jointe; filename =" + pROJNAME + " .pdf "); @ Skliwz –

1
Response.AddHeader("Content-Disposition", "attachment;filename=" & FileName & ";") 
+3

Cela sent la syntaxe VB. –

+0

Faible avertissement Comme avertissement() – JoshYates1980

15

... Pour votre information, si vous utilisez "en ligne" au lieu de "l'attachement" le fichier s'ouvre automatiquement dans IE. Au lieu d'inviter l'utilisateur avec une boîte de dialogue Ouvrir/Enregistrer.

Response.AppendHeader("content-disposition", string.Format("inline;FileName=\"{0}\"", fileName)); 
+0

C'est exactement ce que je cherchais. Le prochain problème est que je veux définir un nom de fichier par défaut ainsi quand ils frappent le bouton de sauvegarde il aura le bon nom de fichier par défaut. À l'heure actuelle, le nom du fichier est défini sur le nom de la page aspx qui a généré le pdf. Quelqu'un a une suggestion? – Kevbo

1

Pour une raison quelconque, la plupart des réponses ne semblent même pas tenter d'encoder la valeur du nom de fichier. Si le fichier contient des espaces, des points-virgules ou des guillemets, il peut ne pas s'afficher correctement.

Il semble que vous pouvez utiliser la classe ContentDisposition pour générer une valeur d'en-tête:

Response.AppendHeader("Content-Disposition", new ContentDisposition 
{ 
    FileName = yourFilename 
}.ToString()); 

Vous pouvez consulter the source code for ContentDisposition.ToString() pour confirmer qu'il essaie de coder correctement.

Avertissement: Cela semble se bloquer lorsque le nom de fichier contient un tiret (pas un tiret). Je n'ai pas pris la peine de m'en occuper pour le moment.

Questions connexes