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

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

Rekommendera Poster

nsky

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

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
.M

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

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Cluster

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);

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
.M

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

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
nsky

Tack! Ska försöka hinna titta på det under dagen.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...