Använd Generic handler för att visa bilder

Ni har säkert sätt att på en del hemsidor så använder dom till exempel: www.minsida.se/Image.ashx?path=bild.jpg istället för www.minsida.se/bild.jpg. Det finns en del sätt att göra detta på. Det jag tänkte visa är med en Generic handler.

Högerklicka på ditt projekt/website och välj Add new item och leta upp Generic handler. När den filen skapas så kommer den classen att se ut såhär.

    [WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Image : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World");
}
public bool IsReusable
{
get
{
return false;
}
}
}
Vi kan ta bort 
[WebService(Namespace = "http://tempuri.org/")] och
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] i topen på våran class. Dom behöver inte. Sedan tar vi bort allt innan för
ProcessRequest(...){ all kod här }.

Sedan skriver vi in detta

if (context.Request.QueryString["path"] != null)
{
/// Här ska våran kod in senare
}
else 
{
} 
 
Om något finns efter = så kommer den gå in i if(..) och köra vidare. om inte  så kör den vidare i else där man kan skriva in ett fel meddelanden om man vill. 
Sedan behöver vi skapa en string som vi kallar imgUrl där vi fångar upp det som står efter = i webbadressen. 
string imgUrl = context.Server.MapPath("~/" + context.Request.QueryString["path"]);

context.Server.MapPath(...) laddar den filen vi vill komma åt. Sedan måste vi ta reda på ifall det är en .jpg, .gif eller .png bild.

Det gör vi lättast såhär:

 

if (imgUrl.EndsWith("jpg"))
{
context.Response.ContentType = "image/jpeg";
context.Response.TransmitFile(imgUrl);
}
else if (imgUrl.EndsWith("gif"))
{
context.Response.ContentType = "image/gif";
context.Response.TransmitFile(imgUrl);
}
else if (imgUrl.EndsWith("png"))
{
context.Response.ContentType = "image/png";
context.Response.TransmitFile(imgUrl);
}
else
{
context.Response.Write("fel bildformat");
}

 Både stringen och koden ovan klistra vi in imellan if(context.Request.Querystring["path"] != null)

Våran slutliga kod blir såhär

 

public class Image : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
if (context.Request.QueryString["path"] != null)
{
string imgUrl = context.Server.MapPath("~/" + context.Request.QueryString["path"]);

if (imgUrl.EndsWith("jpg"))
{
context.Response.ContentType = "image/jpeg";
context.Response.TransmitFile(imgUrl);
}
else if (imgUrl.EndsWith("gif"))
{
context.Response.ContentType = "image/gif";
context.Response.TransmitFile(imgUrl);
}
else if (imgUrl.EndsWith("png"))
{
context.Response.ContentType = "image/png";
context.Response.TransmitFile(imgUrl);
}
else
{
context.Response.Write("error");
}
}
}

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

 Då kommer man kunna använda Image.ashx såhär: www.minsida.se/Image.ashx?path=bild.jpg

No Comments