2008-09-01 10 views
23

¿Cuál es la mejor manera de implementar, desde una página web, una acción de descarga usando asp.net 2.0?Cómo implementar una descarga de archivos en asp.net

Los archivos de registro para una acción se crean en un directorio llamado [raíz de la aplicación]/registros. Tengo la ruta completa y deseo proporcionar un botón que, al hacer clic, descargue el archivo de registro del servidor IIS a la PC local del usuario.

+0

¿Usaría Response.TransmitFile (también para un archivo pequeño? –

Respuesta

33

ayuda esto a:

http://www.west-wind.com/weblog/posts/76293.aspx

Response.ContentType = "application/octet-stream"; 
Response.AppendHeader("Content-Disposition","attachment; filename=logfile.txt"); 
Response.TransmitFile(Server.MapPath("~/logfile.txt")); 
Response.End(); 

Response.TransmitFile es la forma aceptada de enviar archivos de gran tamaño, en lugar de Response.WriteFile.

+7

Una parte CLAVE de esto es Response.End() - sin ella terminará con descargas ocasionalmente corruptas, firmas digitales rotas, todo tipo de rarezas –

+0

No funciona con archivos PNG. ¿Cómo debo hacerlo? –

+0

¿Se puede usar o modificar para obtener un archivo remoto de otra URL? – AlexVPerl

10

http://forums.asp.net/p/1481083/3457332.aspx

string filename = @"Specify the file path in the server over here...."; 
FileInfo fileInfo = new FileInfo(filename); 

if (fileInfo.Exists) 
{ 
    Response.Clear(); 
    Response.AddHeader("Content-Disposition", "attachment; filename=" + fileInfo.Name); 
    Response.AddHeader("Content-Length", fileInfo.Length.ToString()); 
    Response.ContentType = "application/octet-stream"; 
    Response.Flush(); 
    Response.TransmitFile(fileInfo.FullName); 
    Response.End(); 
} 


Actualización:

El código inicial

Response.AddHeader("Content-Disposition", "inline;attachment; filename=" + fileInfo.Name); 

tiene "inline; apego" es decir, dos valores para la disposición de contenido.

No sé exactamente cuándo comenzó, pero en Firefox solo no aparecía el nombre de archivo correcto. El cuadro de descarga de archivos aparece con el nombre de la página web y su extensión (pagename.aspx). Después de la descarga, si cambia el nombre al nombre real; el archivo se abre con éxito

Según this page, funciona en Primero en llegar sirve base. Cambiar el valor a attachment solo resolvió el problema.

PD: No estoy seguro de si esta es la mejor práctica pero el problema está resuelto.

+2

-1: Como dijo Martin, use TransmitFile en lugar de WriteFile. WriteFile es esencialmente roto para archivos grandes – Niki

+0

+1 para solucionar la respuesta! – bnieland

+0

Estoy haciendo esto con un botón dentro de un ModalPopupExtender que funciona con un panel de actualización y no funcionará. Sin embargo, si muevo el botón fuera del área modalpopup/updatepanel funciona perfectamente? ¿Alguna idea de cómo evitar esto? – JoeManiaci

Cuestiones relacionadas