En mi clase ApiController, tengo el siguiente método para descargar un archivo creado por el servidor.
public HttpResponseMessage Get(int id)
{
try
{
string dir = HttpContext.Current.Server.MapPath("~"); //location of the template file
Stream file = new MemoryStream();
Stream result = _service.GetMyForm(id, dir, file);
if (result == null)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
result.Position = 0;
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
return response;
}
catch (IOException)
{
return Request.CreateResponse(HttpStatusCode.InternalServerError);
}
}
Todo funciona perfectamente, excepto que el nombre del archivo de descarga predeterminado es su ID, por lo que el usuario puede tener que escribir su propio nombre de archivo cada vez que guarde el diálogo. ¿Hay alguna forma de establecer un nombre de archivo predeterminado en el código anterior?
c#
asp.net-web-api
Tae-Sung Shin
fuente
fuente
Respuestas:
Debe configurar el
Content-Disposition
encabezado enHttpResponseMessage
:fuente
System.Net.Mime.ContentDisposition
oContentDispositionHeaderValue
? ¿Es uno más actual y más preferido que el otro?ActionResult
, una paraHttpResponseMessage
ActionResult
y otro para WebApiHttpResponseMessage
.EDITAR: Como se mencionó en un comentario, Mi respuesta no tiene en cuenta los caracteres que deben escaparse como a
;
. Debe usar la respuesta aceptada que Darin hizo si su nombre de archivo pudiera contener un punto y coma.Agregue un Response.AddHeader para establecer el nombre del archivo
Simplemente cambie FILE_NAME al nombre del archivo.
fuente
;
u otra cosa con un significado especial?Si desea asegurarse de que el nombre del archivo esté codificado correctamente pero también evitar el mensaje HttpResponseMessage de WebApi, puede usar lo siguiente:
Puede usar ContentDisposition o ContentDispositionHeaderValue. Llamar a ToString en una instancia de cualquiera de ellos hará la codificación de los nombres de archivo por usted.
fuente
Creo que esto podría ser útil para usted.
fuente
;
u otra cosa con un significado especial?Debe agregar el encabezado de disposición de contenido a la respuesta:
fuente
;
u otra cosa con un significado especial?Si está utilizando ASP.NET Core MVC, las respuestas anteriores están muy ligeramente alteradas ...
En mi método de acción (que devuelve
async Task<JsonResult>
) agrego la línea (en cualquier lugar antes de la declaración de devolución):fuente
Esto debería hacer:
fuente
;
u otra cosa con un significado especial?Nota: La última línea es obligatoria.
Si no especificamos Access-Control-Expose-Headers , no obtendremos el nombre del archivo en la interfaz de usuario.
fuente
Teniendo en cuenta las respuestas anteriores, es necesario tener cuidado con los caracteres globalizados.
Supongamos que el nombre del archivo es: " Esdrújula prenda ñame - güena.jpg "
Resultado sin procesar para descargar: "Esdrújula prenda à ± ame - güena.jpg" [Feo]
Resultado del código HTML para descargar: "Esdr & _250; jula prenda & _241; ame - g & _252; ena.jpg" [Feo]
Resultado de UrlEncode para descargar: " Esdrújula + prenda + ñame + - + güena.jpg " [OK]
Entonces, casi siempre necesita usar UrlEncode sobre el nombre del archivo . Además, si configura el encabezado de disposición de contenido como cadena directa, debe asegurarse de rodear con comillas para evitar problemas de compatibilidad del navegador.
o con ayuda de clase:
El System.Net.Mime. La clase ContentDisposition se encarga de las comillas.
fuente