2010-02-12 19 views
14

¿Es posible generar una imagen (o cualquier tipo de archivo) en un enlace de descarga cuando un usuario hace clic en un enlace de otra página ASP.NET?ASP.NET Imagen de retorno del enlace .aspx

Tengo el nombre del archivo y el byte [].

<a href="getfile.aspx?id=1">Get File</a> 

... donde getfile devuelve el archivo en lugar de ir a la página de getfile.aspx.

Respuesta

19

usted quiere realmente .ashx for that;)

public class ImageHandler : IHttpHandler 
{ 
    public bool IsReusable { get { return true; } } 

    public void ProcessRequest(HttpContext ctx) 
    { 
    var myImage = GetImageSomeHow(); 
    ctx.Response.ContentType = "image/png"; 
    ctx.Response.OutputStream.Write(myImage); 
    } 
} 
+0

¿Hay alguna buena razón para usar esto en una página ASPX? –

+1

.aspx pasaría por el ciclo de vida de la página. .ashx es mejor aquí porque no hay necesidad de eso, por lo que probablemente tenga un mejor rendimiento. Ver también: http: // stackoverflow.com/questions/5469491/aspx-vs-ashx-main-difference – ziya

1

Sí, usted tiene que limpiar la respuesta por completo y reemplazarlo con los datos byte imagen como una cadena, y lo que necesita para asegurarse de que para establecer la cabecera de respuesta para el tipo de contenido de acuerdo con el tipo de imagen

+0

¿Qué pasa si no tengo el tipo de contenido? –

+0

Inferirlo desde la extensión de archivo. Eso es todo lo que el sistema operativo está haciendo de todos modos (cambie una extensión jpg a un archivo .gif y pregunte a cualquier función o utilidad incorporada qué tipo de archivo es). – Rich

+2

Según http://www.w3.org/Protocols/rfc1341/4_Content-Type.html y http://en.wikipedia.org/wiki/Internet_media_type, debe usar "application/octet-stream" para un contenido desconocido. -tipo. Pero si envía una imagen para que se muestre en la página, entonces el navegador tendrá que saber el tipo de contenido y usted tiene que hacer lo que dice @Rich. Pero el tipo de contenido de transmisión de octetos funcionará solo si guarda el archivo, ya que al navegador no le importa qué es. –

3

Así es como yo he hecho esto en el pasado:

Response.Clear(); 
Response.Buffer = true; 
Response.AddHeader("Content-Disposition", string.Format("inline;filename=\"{0}.pdf\"",Guid.NewGuid())); 
Response.ContentType = @"application/pdf"; 
Response.WriteFile(path); 
+0

Tener un espacio entre "en línea"; y el "nombre de archivo" parecía importar en mi servidor –

5

How to Create Text Image on the fly with ASP.NET

Algo como esto:

string Path = Server.MapPath(Request.ApplicationPath + "\image.jpg"); 
Bitmap bmp = CreateThumbnail(Path,Size,Size); 
Response.ContentType = "image/jpeg"; 
bmp.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg); 
bmp.Dispose(); 
+0

ashx es la mayor parte del tiempo lo que quiere PERO alguna vez realmente necesita una página aspx por ejemplo si usa MapPageRoute que no acepta un ashx. – Zyo

0

el código de código subyacente para getfile.aspx tiene que tener un content-type y el navegador sabrá que se trata de una imagen o un archivo desconocido y le permitirá ahorrar ella.

En asp.net puede ajustar la ContentType utilizando el objeto Response, es decir

Response.ContentType = "image/GIF" 

Here usted tiene un tutorial para una imagen generada dinámicamente

1

Sí, esto es posible. Hay dos partes del objeto Response que necesita establecer: Content-Type y HTTP Header. El MSDN documentation tiene los detalles sobre el objeto de respuesta, pero el concepto principal es bastante simple. Simplemente configure el código a algo como esto (para un documento de Word).

Response.ContentType="application/ms-word"; 
Response.AddHeader("content-disposition", "attachment; filename=download.doc"); 

Hay un ejemplo más completo here

0

ashx ...

public class ImageHandler : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext ctx) 
    { 
     string path = ".....jpg"; 

       byte[] imgBytes = File.ReadAllBytes(path); 
       if (imgBytes.Length > 0) 
       { 
        ctx.Response.ContentType = "image/jpeg"; 
        ctx.Response.BinaryWrite(imgBytes); 
       } 
    } 

    public bool IsReusable 
    { 
     get {return false;} 
    } 
} 
Cuestiones relacionadas