Especificación del nombre de archivo para PDF dinámico en asp.net
Pregunta
¿Cómo puedo especificar el nombre del archivo al descargar datos en el flujo de respuesta?
Ahora mismo 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, obtengo "foo.aspx.pdf" como nombre de archivo para guardar.Creo recordar haber podido agregar un encabezado a la respuesta para especificar el nombre del archivo a guardar.
Solución
Agregue una disposición de contenido al encabezado:
Response.AddHeader("content-disposition", @"attachment;filename=""MyFile.pdf""");
Otros consejos
Para tu información...Si utiliza "en línea" en lugar de "archivo adjunto", el archivo se abrirá automáticamente en IE.En lugar de solicitar al usuario un diálogo Abrir/Guardar.
Response.AppendHeader("content-disposition", string.Format("inline;FileName=\"{0}\"", fileName));
Response.AppendHeader("Content-Disposition", "attachment; filename=foo.pdf");
Por alguna razón, la mayoría de las respuestas ni siquiera parecen intentar codificar el valor del nombre del archivo.Si el archivo contiene espacios, punto y coma o comillas, es posible que no se muestre correctamente.
Parece que puedes usar el ContentDisposition
clase para generar un valor de encabezado correcto:
Response.AppendHeader("Content-Disposition", new ContentDisposition
{
FileName = yourFilename
}.ToString());
Puedes consultar el código fuente para ContentDisposition.ToString()
para confirmar que está intentando codificarlo correctamente.
Advertencia:Esto parece fallar cuando el nombre del archivo contiene un guión (no un guión).No me he molestado en investigar esto todavía.
Response.AddHeader("Content-Disposition", "attachment;filename=" & FileName & ";")