ciao Ferdinando,
modelrc ha scritto:
ho bisogno che quando imposto la cartella in questione se non esistono crea le miniature
Ok, in questa discussione (primissimi post) abbiamo visto come sia possibile generare le miniature "al volo" usando un HttpHandler, così non sarebbe obbligatorio memorizzarle su disco.
Se per te non è un problema che vengano salvate su disco, allora si può usare anche un altro sistema. Potremmo creare una sottocartella "miniature" per ognuna delle mille cartelle immagini che hai. Ovviamente non andrebbe fatto a mano ma automaticamente e secondo necessità, cioè solo quando si richiede alla pagina aspx di visualizzare una specifica cartella immagini.
Partiamo dal codice che abbiamo usato per elencare le immagini di una cartella.
var cartellaSito = Server.MapPath("~/");
var cartellaImmagini = Server.MapPath("~/categorie/divani");
var immagini = Directory.GetFiles(cartellaImmagini, "*.jpg").Select(img => img.Substring(cartellaSito.Length));
Modifichiamolo leggermente affinché per ogni immagine sia effettuato un controllo sulla relativa miniatura. Se non esiste ancora, andremo a crearla.
var cartellaSito = Server.MapPath("~/");
var cartellaImmagini = Server.MapPath("~/categorie/divani");
//Ogni cartella immagini avrà la sua sottocartella "miniature"
var cartellaMiniature = Path.Combine(cartellaImmagini, "miniature");
var immaginiOriginali = Directory.GetFiles(cartellaImmagini, "*.jpg");
//controllo che la cartella "miniature" esista e in caso negativo la creo
if (!Directory.Exists(cartellaMiniature))
Directory.CreateDirectory(cartellaMiniature);
//per ognuna delle immagini originali...
var immagini = immaginiOriginali.Select(originale => {
//mi calcolo il percorso della miniatura
var miniatura = Path.Combine(cartellaMiniature, Path.GetFileName(originale));
//se la miniatura non esiste, allora vado a crearla
if (!File.Exists(miniatura))
{
//Funzione che ridimensiona l'immagine originale e salva la miniatura sul suo percorso
CreaMiniatura(originale, miniatura);
}
//restituisco un tipo anonimo che contiene entrambi i percorsi virtuali: sia dell'immagine originale che della miniatura
return new {
Originale = originale.Substring(cartellaSito.Length - 1).Replace(Path.DirectorySeparatorChar, '/'),
Miniatura = miniatura.Substring(cartellaSito.Length - 1).Replace(Path.DirectorySeparatorChar, '/')
};
});
Qui trovi due cose a cui fare attenzione:
- La funzione CreaMiniatura dovrà leggere l'immagine originale e salvare la miniatura. Qui trovi del codice che ti aiuterà a scriverla: http://www.codeproject.com/Articles/250346/Thumbnail-using-Csharp-Net
- La variabile immagini ora sarà una collezione di un tipo anonimo che contiene due proprietà: Originale e Miniatura. Dato che la metti in binding con un ListView, dovrai fare degli aggiustamenti nel suo ItemTemplate. Da questo momento in poi, l'asp:Image visualizzerà la miniatura mentre l'HyperLink continuerà a puntare all'immagine originale.
<asp:HyperLink ID="HyperLink1" rel="prettyPhoto" NavigateUrl='<%# Eval("Originale") %>' runat="server">
<asp:Image ImageUrl='<%# Eval("Miniatura") %>' runat="server" Width="60" />
</asp:HyperLink>
ciao,
Moreno
Modificato da BrightSoul il 30 agosto 2013 16.56 -