333 messaggi dal 05 agosto 2005
Ciao Ragazzi,

Sto cercando di creare un Handler per caricare delle immagini caricate in un DB MSSQL2005 e posizionarle in una colonna di un Gridview.

Seguendo il protocollo, ho aggiunto un gridview al mio web form, ho configurato l'sqldatasource esclusa la colonna contenente le immagini (imgData).

Ho aggiunto alla soluzione un Handler:


-----------------------------------------------------------------------------

<%@ WebHandler Language="VB" Class="Handler" %>

Imports System
Imports System.IO
Imports System.Web
Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient

Public Class ImageTool

Implements IHttpHandler


Public Sub ProcessRequest(ByVal context As HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
Dim myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("rachel").ConnectionString)
myConnection.Open()
Dim sql As String = "Select imgData from ImagePreview where imgId=@imgId"
Dim cmd As SqlCommand = New SqlCommand(sql, myConnection)
cmd.Parameters.Add("@ImgId", SqlDbType.Int).Value = context.Request.QueryString("ID")
cmd.Prepare()
Dim dr As SqlDataReader = cmd.ExecuteReader()
dr.Read()
context.Response.ContentType = dr("ImgType").ToString()
context.Response.BinaryWrite(CType(dr("ImgData"), Byte()))
End Sub



Public ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable
Get

End Get
End Property


End Class

-----------------------------------------------------------------------------


A questo punto, ho aggiunto al gridview un Templatefield:

-----------------------------------------------------------------------------


<asp:TemplateField HeaderText="imgData" SortExpression="imgData">
<ItemTemplate>
<asp:Image ID="test" ImageUrl='<%# "~/handler.ashx?ID=" & Eval("imgID") %>' runat="server"/>
</ItemTemplate>
</asp:TemplateField>

-----------------------------------------------------------------------------

Durante il rendering della pagina, vedo che viene richiamato l'Handeler e gli vengono passati i relativi imgID, ma la mia colonna non visualizza le immagini relative. Mi appare solo la classica crocetta rossa.

Dove sbaglio? Devo registrare l'Handeler nel web.config? Se si, come?

Grazie

Marco
333 messaggi dal 05 agosto 2005
Non ditemi che nessuno ha mai adoperato un Handler prima.
Nessuna idea?
141 messaggi dal 21 febbraio 2002
www.melisweb.eu
Che HTML ti da in uscita?

]aMelix[
-------------------------------
http://www.melisweb.eu/
http://www.puntodidomanda.com/
http://www.cucinamore.com/
-------------------------------
333 messaggi dal 05 agosto 2005
Scusa Amelix, ma che cosa intendi per HTML in uscita?

Grazie

Marco
141 messaggi dal 21 febbraio 2002
www.melisweb.eu
L'output che risulta dalla pagina aspx
Non vorrei fosse solo un problema di percorsi.

La pagina è visibile da internet?
Se si, a che indirizzo?

]aMelix[
-------------------------------
http://www.melisweb.eu/
http://www.puntodidomanda.com/
http://www.cucinamore.com/
-------------------------------
333 messaggi dal 05 agosto 2005
Ho finalmente risolto.
Ho modificato l'Handler in questo modo:

<%@ WebHandler Language="VB" Class="ImageFetch" %>

Imports System.Web
Imports System.Data.SqlClient
Imports System.Data

'The idea behind this is to simply fetch the image out of the database and stream it down the network.
Public Class ImageFetch : Implements IHttpHandler

Const BUFFERSIZE As Integer = 1024

Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return True
End Get
End Property

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim response As Web.HttpResponse = context.Response
Dim request As Web.HttpRequest = context.Request
response.ContentType = "image/jpeg"
response.Cache.SetCacheability(HttpCacheability.Public)
response.BufferOutput = False

writeSingleImage(CInt(request.QueryString("ImageID")), CInt(request.QueryString("Size")), response.OutputStream)
response.End()

End Sub

Public Sub writeSingleImage(ByVal ImageID As Integer, ByVal size As Integer, ByVal output As IO.Stream)
'todo fix the following line of code
Dim cxnstr As String = ConfigurationManager.ConnectionStrings("your connection string").ConnectionString
Dim connection As New SqlConnection(cxnstr)
Dim query As String

query = "select imgData from imagePreview where imgid=@item_id"



Dim command As New SqlCommand(query, connection)
Dim param0 As New Data.SqlClient.SqlParameter("@item_id", Data.SqlDbType.Int)
param0.Value = ImageID
command.Parameters.Add(param0)
connection.Open()

Dim d As Byte() = CType(command.ExecuteScalar(), Byte())
output.Write(d, 0, d.Length)


connection.Close()

End Sub
End Class


e l'ho richiamato in questo modo:

<asp:Image ID="ImageButton1" ImageUrl='<%# "imagefetch.ashx?size=1&imageid=" & Cstr(Eval("imgId")) %>' runat ="server" Height="100px" BorderColor="Black" BorderStyle="Solid" BorderWidth="1px"/>

Grazie ancora Amelix

Marco

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.