Freeteo


Pensieri e C#dice di Matteo Raumer

asp.net, recuperare immagine dall'icona associata al file

Spesso mi capita di dare in output su una pagina web, una serie di files, e la cosa che ormai ogni utente si aspetta è avere vicino la sua icona associata, come fa esplora risorse di Windows.
Chiaramente se si sapessero a priori i tipi di file si potrebbe pensare di mettere una serie di immagini sul server e visualizzarle tramite Tag "img", in base all'estensione, ma molto spesso (potrei dire "quasi sempre" ormai) i file sono di svariate tipologie.
La cosa più semplice da fare quindi è chiedere a Windows qual'è l'icona che ha associato per quel file, e visualizzare quella e per farlo il Framework ci mette a disposizione un metodo bello e pronto della classe Icon:
Icon.ExtractAssociatedIcon("...filePath...");
 
A questo punto basta convertire l'icona in un bitmap da dare in risultato come streaming di byte immagine ad una richiesta HTTP, per fare questo ci serve un handler da richiamare quando vogliamo avere l'immagine:

public class IconHandler : IHttpHandler
{
  
public bool IsReusable { get { return false; } }


   
static Dictionary<string, Icon> cache = new Dictionary<string, Icon>();

  
public void ProcessRequest (HttpContext context)
   {
     
string file = context.Request["file"];
     
     
//--- safety code
     
if(string.IsNullOrEmpty(file) || !File.Exists(file))
        
return;

     
Icon icona;

     
//--- per migliorare tengo qualcosa in cache
      string ext = Path.GetExtension(file);
      if (cache.ContainsKey(ext))
         icona = cache[ext];
      else
      {   
         icona =
Icon.ExtractAssociatedIcon(file);
         cache.Add(ext, icona);
      }


      //--- renderizzo
      Bitmap bmp = icona.ToBitmap();
      context.Response.ContentType =
"image/jpeg";
      bmp.Save(context.Response.OutputStream,
ImageFormat.Png);
      bmp.Dispose();
   }
}

Dopodichè basta solo avere un tag img che passa il nome del file all'Handler il quale renderizza l'immagine:

<img src='IconHandler.ashx?file=<%# Eval("FullName") %>' />


Combinando queste 2 cose, è possibile facilmente creare un fileBrowser su server tramite asp.net:



* I files sorgente dell'esempio sono disponibili qui: http://www.dotnethell.it/users/files/1418_FileBrowser.zip
 
L'unica pecca è che il file deve esistere, infatti quel metodo non funziona se per esempio vogliamo l'icona che Windows associa ad un'estensione...esegue l'operazione sul file vero e proprio.
Categoria: Tips
giovedì, 15 lug 2010 Ore. 11.56

Messaggi collegati






  • Views Home Page: 243.345
  • Views Posts: 420.748
  • Views Gallerie: 565.632
  • n° Posts: 163
  • n° Commenti: 148
Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

Anno 2005
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003