Problema con immagini caricate dinamicamente

domenica 09 marzo 2008 - 17.20

Pasko Profilo | Newbie

Salve, ho un website asp.net 2.0 con una pagina sulla quale c'è un datalist. Uno degli oggetti del datalist è di tipo image, e ha associato un indirizzo di un file che viene creato nel page_init.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Premetto che successivamente l'indirizzo mi servirà relativo, sto lavorando con quello assoluto perchè dal personal web server ho problemi a scrivere su percorsi relativi. Il problema è che l'immagine ha l'indirizzo giusto (come ho potuto controllare dal codice html generato), ma non viene visualizzata.

rossimarko Profilo | Guru

Ciao, hai controllato anche che l'immagine sia visualizzabile? Ad esempio, copiando il percorso che trovi nell'html all'interno di esplora risorse l'immagine si visualizza correttamente?

Comunque se hai delle immagini da caricare da database e la tua necessità è semplicemente quella di visualizzarle all'interno della pagina html ti consiglio di non salvarle su disco ma di ritornare direttamente lo stream di una pagina aspx o di un hanlder http.

Se ad esempio crei una pagina aspx per la visualizzazione del file puoi inserire nel page load il codice che ti consente di:
- Caricare da db il record che ti interessa
- Prelevare l'array di byte che rappresentano l'immagine
- Pulire il contenuto dello stream di output (Response.Clear)
- Inserire il content type corretto in base all'immagine (Response.ContentType = "image/JPEG")
- Accodare al buffer di output l'array di byte dell'immagine

Purtroppo adesso non riesco a mandarti un pezzo di codice di esempio, comunque puoi prendere spunto da questo articolo http://support.microsoft.com/kb/326502

Una volta fatta la pagina basterà inserire come imageurl del tuo controllo immagine la chiamata alla pagina aspx con il parametro corretto. Ad esempio
img.ImageUrl = "VisualizzaImmagine.aspx?ID=4"

Se ti serve qualcosa di più dettagliato fammi sapere che ti preparo alcune righe di codice di esempio

Pasko Profilo | Newbie

non mi sono chiare 2 cose: come accodo al buffer di output e da dove salta fuori la variabile ID... cmq te l'ho detto io devo bindare un'immagine su ImageUrl...

rossimarko Profilo | Guru

>non mi sono chiare 2 cose: come accodo al buffer di output e
>da dove salta fuori la variabile ID... cmq te l'ho detto io devo
>bindare un'immagine su ImageUrl...
>

Ti faccio un piccolo esempio. Supponiamo che tu abbia su database una tabella Articoli così composta:
- IDArticolo
- FotoArticolo

La prima colonna è l'identificativo numerico, mentre la seconda conterrà l'array di byte che rappresenta l'immagine.

Per la visualizzazione creiamo una pagina con un datalist che conterrà i dati degli articoli.
Nell'ItemTemplate del datalist inserisci un controllo immagine che prende dal datasource l'id dell'articolo da visualizzare:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
La proprietà ImageUrl punta alla pagina di visualizzazione dell'immagine.

Il codice della pagina ImmagineArticolo.aspx sarà il seguente:

private int IDArticolo { get { string str = Request.QueryString["ID"]; if (String.IsNullOrEmpty(str)) return -1; else return Convert.ToInt32(str); } } protected void Page_Load(object sender, EventArgs e) { if (this.IDArticolo != -1) { //Carica i dati da db (la funzione getArticolo ritorna un datarow con i dati dell'articolo) DataRow dr = GetArticoloFromDB(this.IDArticolo); byte[] arrImage = (byte[])dr["FotoArticolo"]; //Ritorna i dati nello stream di output Response.Clear(); Response.ContentType = "Image/JPEG"; Response.BinaryWrite(arrImage); Response.End(); } }

Così facendo eviti di salvare i dati sul disco (è comunque un'operazione onerosa in termini di performance) e puoi sfruttare anche i meccanismi di caching di asp.net per evitare che tutte le volte i dati vengano caricati da database.

Il codice seguente (da inserire nella pagina aspx) ti consente ad esempio di impostare una cache di 60 secondi. Questa cache è impostata per ogni richiesta valutando però il valore del parametro ID del querystring.
<%@ OutputCache Duration="60" VaryByParam="ID" %>

A questo link trovi alcune informazioni sull'output caching (in inglese): http://msdn2.microsoft.com/en-us/library/ms972362.aspx

Se ti serve qualche chiarimento chiedi pure

Marco

Pasko Profilo | Newbie

Tutto ok, sei un grande... grazie mille, non so come ringraziarti. C'era solo una imprecisione: tu hai usato l'operatore "&" per legare l'indirizzo all'espressione bindata, io ho usato "+", perchè "&" mi dava errore...

rossimarko Profilo | Guru

Si scusami, l'operatore & si usa in VB.Net.

Errore di distrazione

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5