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:
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.