2008-09-16 13 views
31

¿Cómo puedo especificar el nombre del archivo cuando descargo datos en la secuencia de respuesta?Especificación de nombre de archivo para PDF dinámico en asp.net

En este momento estoy haciendo lo siguiente:

byte[] data= GetFoo(); 
Response.Clear(); 
Response.Buffer = true; 
Response.ContentType = "application/pdf";    
Response.BinaryWrite(data); 
Response.End(); 

Con el código anterior, me sale "foo.aspx.pdf" como nombre de archivo para guardar. Me parece recordar que puedo agregar un encabezado a la respuesta para especificar el nombre del archivo para guardar.

Respuesta

53

Añadir un contenido-disposición a la cabecera:

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

Se deben colocar comillas dobles alrededor del nombre del archivo. Ver http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download –

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

Si alguien se pregunta por qué existe tanto 'AddHeader' como' AppendHeader', [no me sorprende más ...] (http://msdn.microsoft.com/en-us/library/system.web.httpresponse. addheader.aspx) –

+0

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

+0

cómo hacer que el nombre de archivo como dinámica Response.AppendHeader ("Content-Disposition", "apego; filename =" + + projname " .pdf "); @ Skliwz –

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

Eso huele a sintaxis VB. –

+0

Dim warnings As Warning() – JoshYates1980

15

FYI ... si se utiliza "en línea" en lugar de "apego" el archivo se abrirá automáticamente en el IE. En lugar de preguntar al usuario con un diálogo Abrir/Guardar.

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

Esto es exactamente lo que estaba buscando. El siguiente problema es que quiero establecer un nombre de archivo predeterminado para que cuando presionen el botón de guardar tenga el nombre de archivo correcto como el predeterminado. En este momento, el nombre del archivo se establece en el nombre de la página aspx que generó el pdf. Alguien tiene una sugerencia? – Kevbo

1

Por alguna razón, la mayoría de las respuestas parece que ni siquiera intentan codificar el valor del nombre del archivo. Si el archivo contiene espacios, punto y coma o comillas, es posible que no se encuentre correctamente.

Parece que se puede utilizar la clase ContentDisposition para generar un valor de encabezado correcta:

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

Se puede extraer de the source code for ContentDisposition.ToString() para confirmar que se está tratando de codificar correctamente.

Advertencia: Parece que se bloquea cuando el nombre del archivo contiene un guión (no un guión). No me he molestado en investigar esto todavía.

Cuestiones relacionadas