2008-12-03 7 views
6

Tengo una base de datos sql que almacena algunos documentos.C# ASP.NET 3.5 problemas de descarga de archivos de disposición de contenido

Un usuario puede iniciar sesión en la aplicación y ver una lista de sus documentos.

Al hacer clic en la descarga de un botón de enlace en una vista de cuadrícula de sus documentos, obtengo el archivo de la base de datos, lo escribo en el sistema de archivos y luego ejecuto este código. Método

System.IO.FileInfo file = new System.IO.FileInfo(System.Configuration.ConfigurationManager.AppSettings["UploadPath"] + DocumentName); 

    Response.Clear(); 
    Response.ClearContent(); 
    Response.ClearHeaders(); 
    Response.Cookies.Clear(); 
    Response.Cache.SetCacheability(HttpCacheability.Private); 
    Response.CacheControl = "private"; 
    Response.Charset = System.Text.UTF8Encoding.UTF8.WebName; 
    Response.ContentEncoding = System.Text.UTF8Encoding.UTF8; 
    Response.AppendHeader("Content-Length", file.Length.ToString()); 
    Response.AppendHeader("Pragma","cache"); 
    Response.AppendHeader("Expires", "60"); 
    Response.ContentType = GetContentType(file.Extension); 
    Response.AppendHeader("Content-Disposition", 
    "inline; " + 
    "filename=\"" + file.Name + "\"; " + 
    "size=" + file.Length.ToString() + "; " + 
    "creation-date=" + DateTime.Now.ToString("R") + "; " + 
    "modification-date=" + DateTime.Now.ToString("R") + "; " + 
    "read-date=" + DateTime.Now.ToString("R")); 

Mi getContentType() sólo devuelve el tipo de archivo adecuado para los archivos que estoy permitiendo "application/pdf, application/msw0rd, etc.

Mi problema es que cuando el archivo se guarda, es la página web en sí, no el archivo del sistema de archivos. Y en google chrome, está poniendo una extensión .htm al final del nombre del archivo, supongo porque sabe que es una página web?

De todos modos, una gran primera el paso sería obtener el archivo real, y no una copia de la página web en HTML en la que están sentados!

Gracias.

Respuesta

9

¿Cómo estás enviando el contenido real del archivo ??

I usualmente usa el método Response.TransmitFile, básicamente abre el archivo y envía su contenido a Response.OutputStream

3

¿Ha intentado configurar el contenido-disposición en "archivo adjunto" en lugar de "en línea"? Creo que el navegador le pedirá al usuario que abra o guarde el documento.

Además, generalmente puede omitir el sistema de archivos al escribir su secuencia de bytes desde la base de datos directamente al objeto Response con el método BinaryWrite ... Este también es un caso en el que es posible que desee investigar utilizando un controlador HTTP en lugar de una página ASPX para que no tenga que preocuparse por borrar la respuesta, etc. He tenido éxito en el pasado con el uso de un iframe oculto en la página, luego uso Javascript para configurar su src en un controlador HTTP que toma el documento ID como un parámetro en QueryString.

9

En lugar de

Response.AppendHeader ("Content-Disposition", "inline;" + "nombre de archivo =

uso

Response.AddHeader (" Content-Disposition:", "apego; filename =

Cuestiones relacionadas