Just nu i M3-nätverket
Gå till innehåll

Visa bild där bilden är lagrad i en SQL-databas


nsky

Rekommendera Poster

Har en sida där jag vill visa en bild som är sparad i en sql-databas, har inte valt själv att spara bilden direkt i databasen utan det är bestämt så sen innan. Har hittat ett exempel för detta men får det inte att fungera. Exempel

 

Där bilden ska visas (ligger även en Image-kontroll på .aspx-sidan)

Default.aspx.vb

Dim persID As Integer = Request.QueryString("ID")
Image1.ImageUrl = "ShowImage.ashx?ID=" & persID

 

ShowImage.ashx

Imports System.Web
Imports System.Web.Services
Imports System.IO
Imports System.Data.SqlClient

Public Class ShowImage1
   Implements System.Web.IHttpHandler
   Private myConnection As New SqlConnection(ConfigurationSettings.AppSettings("connectToSQL"))

   Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
       Dim empno As Int32
       If Not context.Request.QueryString("ID") Is Nothing Then
           empno = Convert.ToInt32(context.Request.QueryString("ID"))
       Else
           Throw New ArgumentException("No parameter specified")
       End If

       context.Response.ContentType = "image/jpeg"
       Dim strm As Stream = ShowEmpImage(empno)
       Dim buffer As Byte() = New Byte(4095) {}
       Dim byteSeq As Integer = strm.Read(buffer, 0, 4096)

       Do While byteSeq > 0
           context.Response.OutputStream.Write(buffer, 0, byteSeq)
           byteSeq = strm.Read(buffer, 0, 4096)
       Loop
       'context.Response.BinaryWrite(buffer);
   End Sub

   Public Function ShowEmpImage(ByVal empno As Integer) As Stream

       Dim sql As String = "SELECT a.FOTO FROM NAMNDPERSON AS np INNER Join ADRESS a ON np.PERSONID = a.PERSONID where np.PERSONID = @ID"
       Dim cmd As SqlCommand = New SqlCommand(sql, myConnection)
       cmd.CommandType = CommandType.Text
       cmd.Parameters.AddWithValue("@ID", empno)
       myConnection.Open()
       Dim img As Object = cmd.ExecuteScalar()
       Try
           Return New MemoryStream(CType(img, Byte()))
       Catch
           Return Nothing
       Finally
           myConnection.Close()
       End Try
   End Function

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

 

Någon som kan se varför det inte fungerar?

SQL-satsen ska fungera alla fall

SELECT a.FOTO FROM NAMNDPERSON AS np INNER Join ADRESS a ON np.PERSONID = a.PERSONID where np.PERSONID

Länk till kommentar
Dela på andra webbplatser

Kan du bekräfta att du får ut data i din bytearray från databasen? Har för mig att när jag läste bilder därifrån så var det "lite knepigt".

Länk till kommentar
Dela på andra webbplatser

Har bara som hastigast ögnat igenom koden... men är det inte lite märkligt med en "kommenterande enkelflutt" innan binary write i ShowImage1?

'context.Response.BinaryWrite(buffer);

Länk till kommentar
Dela på andra webbplatser

Har bara som hastigast ögnat igenom koden... men är det inte lite märkligt med en "kommenterande enkelflutt" innan binary write i ShowImage1?

'context.Response.BinaryWrite(buffer);

Anledningen är antagligen att man skriver direkt till OutputStream tre-fyra rader ovanför.

 

Men som komplement till ursprungsfrågan, så har jag hittat min kod som gör det du är ute efter. Så här hämtar jag bilden

SqlDataReader reader = cmd.ExecuteReader();
while ( reader.Read() )
{
ContentType = reader.GetString( 0 );
int imageLength = reader.GetInt32( 1 );    // Gets the size of the image.
this.img = new byte[imageLength];         // create the image byte array.
long retval = reader.GetBytes( 2, 0, this.img, 0, imageLength );
}

Och jag skriver ut den med

context.Response.BinaryWrite( this.img );

För att få fram storlekent på bilden så gör jag så här

SELECT
	IsNull(ContentType, 'image/jpeg') as contentype,
	DATALENGTH([image]) As [size],
	[image] as img
FROM ...
WHERE imgid = ...

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...