Toon posts:

[c#] Ophalen foto uit database

Pagina: 1
Acties:
  • 291 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben heel de dag al bezig om goede voorbeelden te vinden om een foto uit een sql server database op te halen en deze op een asp.net pagina te laten zien.
Ik kan de foto naar binary schrijven(krijg je van die mooie tekens in IE) maar de foto omzetten naar een 'foto formaat' lukt me niet, hieronder een stukje code gebruik ik:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//get the image id from the url
string ImageId = Request.QueryString["img"];
//build our query statement
string sqlText = "SELECT img_data, img_contenttype FROM Image WHERE img_pk = " + ImageId;
SqlConnection connection = new SqlConnection( ConfigurationSettings.AppSettings["DSN"].ToString() );
SqlCommand command = new SqlCommand( sqlText, connection);
//open the database and get a datareader
connection.Open();
SqlDataReader dr = command.ExecuteReader();
if ( dr.Read()) //yup we found our image
{
Response.ContentType = dr["img_contenttype"].ToString();
Response.BinaryWrite( (byte[]) dr["img_data"] );
}
connection.Close();


Ik heb al volop op google etc gezocht maar ik kom maar niet verder. Wat vergeet ik nu nog?
Moet ik de binary naar een image schrijven??

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:35
Kijk eens naar de Bitmap class en vooral naar z'n constructors.
Bitmap heeft een constructor die een 'Stream' neemt als argument.

Kijk nu eens naar de MemoryStream class en z'n constructors.

https://fgheysels.github.io/


  • Gertjan
  • Registratie: Oktober 2001
  • Laatst online: 07-02 20:23

Gertjan

mmmm, beer...

Ik weet niet precies hoe het met c# werkt, maar kan het zijn dat je nog een content-type aan moet geven?

Verwijderd

Topicstarter
Ik doe toch al een contenttype plaatsen? Ik ga eens naar die bitmap classen kijken

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 21:15
Je kan ook een aspx maken die verder geen content schrijft, alleen je image. Dan geef je je image een ImageUrl als dit ongeveer: GetImage.aspx?imageID=12

Roomba E5 te koop


Verwijderd

Topicstarter
sig69 ik heb een aspx pagina die dat zou moeten doen
code:
1
string ImageId = Request.QueryString["img"];

maar ik blijf de binairy data zien.

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:35
sig69 schreef op maandag 18 april 2005 @ 19:37:
Je kan ook een aspx maken die verder geen content schrijft, alleen je image. Dan geef je je image een ImageUrl als dit ongeveer: GetImage.aspx?imageID=12
Doe je dat dan door een eigen httphandler oid te schrijven ? (asp.net zit ver)

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:35
Ff een vlug testje gedaan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class miep : IHttpHandler
{
    public miep()
    {
            
    }

    #region IHttpHandler Members

    public void ProcessRequest(HttpContext context)
    {
                // Dit even vervangen door code die de image uit de DB haalt.
        Bitmap bmp = new Bitmap (@"c:\test.jpg");  
               
        context.Response.ContentType = "image/jpeg";
        bmp.Save (context.Response.OutputStream ,       
                       System.Drawing.Imaging.ImageFormat.Jpeg);
        context.Response.End();
    }

    public bool IsReusable
    {
        get
        {
            // TODO:  Add miep.IsReusable getter implementation
            return false;
        }
    }

    #endregion
}


Dit is dus een custom http-handler. Als je dit maakt, dan moet je wel nog ff een regeltje in je web.config opnemen:

code:
1
2
3
4
<httpHandlers>
    <add verb="*" path="hello.aspx"
        type="WebConsumer.miep,WebConsumer"/>
</httpHandlers>


Als je nu in je browser naar "hello.aspx" surft, dan zie je die image in je browser.

Nu kan je in een webform dus ook een Image control op je webform zetten, en dan de ImageUrl laten verwijzen naar die 'hello.aspx' pagina.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami, ik heb je code getest en het werkt!! Alleen nog op fileniveau:

code:
1
2
                // Dit even vervangen door code die de image uit de DB haalt.
        Bitmap bmp = new Bitmap (@"c:\test.jpg");


Ik snap je vervanging niet, hoe moet dat precies eruit zien dan?

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:35
Euh, ,je hebt toch al (min of meer) de code om je image uit je DB te halen ?

code:
1
2
3
Bitmap myImage = new Bitmap (new MemoryStream (byteArrayThatYouLoadedFromTheDatabase));
...
myImage.Save (context.Response.OutputStream, ...);

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Mag ik ondertussen nog even vragen waarom je niet de URL naar de image in de db zet, en de foto zelf in het filesystem? Dat is (voorlopic nog) de beste plaats om binaire bestanden op te slaan.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:29

gorgi_19

Kruimeltjes zijn weer op :9

P_de_B schreef op maandag 18 april 2005 @ 20:31:
Mag ik ondertussen nog even vragen waarom je niet de URL naar de image in de db zet, en de foto zelf in het filesystem? Dat is (voorlopic nog) de beste plaats om binaire bestanden op te slaan.
Hoezo? Gooi het in de outputcache en je hebt betere performance dan op het FS, normaliter.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 21:15
De Bitmap class heeft ook een constructor die een stream als parameter neemt. Je kan dan een memorystream vullen met je plaatje uit de db, en deze aan de bitmap meegeven. Je maakt dan als het ware een plaatje in het geheugen.
whoami schreef op maandag 18 april 2005 @ 19:39:
[...]
Doe je dat dan door een eigen httphandler oid te schrijven ? (asp.net zit ver)
Neuh, gewoon een lege aspx pagina die het plaatje binair schrijft met
C#:
1
2
3
4
5
// Finally, download it
Response.ClearHeaders();            
Response.AddHeader( "content-disposition","attachment; filename=" + filename );
Response.BinaryWrite( fileData ); // fileData is een byteArray uit de DB
Response.End();
Ik heb alleen ff geen code bij de hand, is alweer ff geleden.

[ Voor 15% gewijzigd door sig69 op 19-04-2005 09:11 ]

Roomba E5 te koop


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
gorgi_19 schreef op maandag 18 april 2005 @ 20:33:
[...]

Hoezo? Gooi het in de outputcache en je hebt betere performance dan op het FS, normaliter.
Mja, cache zou kunnen helpen, toch zou ik wel eens een performance test willen zien. Je kunt best gelijk hebben, maar ik geloof je niet op voorhand :)

Het was iig altijd trager, maar ik reken misschien een beetje buiten de mogelijkheden van chaching.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:29

gorgi_19

Kruimeltjes zijn weer op :9

P_de_B schreef op maandag 18 april 2005 @ 20:54:
[...]


Mja, cache zou kunnen helpen, toch zou ik wel eens een performance test willen zien. Je kunt best gelijk hebben, maar ik geloof je niet op voorhand :)

Het was iig altijd trager, maar ik reken misschien een beetje buiten de mogelijkheden van chaching.
Geef je groot gelijk :)
What has happened over here? The performance is even better than the static page. The reason of this (impossible) difference is that the static page is about 2 times (in my case with my 8 image files) larger than the dynamic page because we've saved the static page using Internet Explorer which has added extra indentation, some meta tags, other img src attributes and extra linefeeds to the source.
Hier staat een hele simpele test, welke ook een indicatie moet zijn :) Memorycache moet sneller zijn dan filecache is zijn conclusie :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 21:15
Ik mijn reactie even geupdate, die code zou moeten werken.

Roomba E5 te koop


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:29

gorgi_19

Kruimeltjes zijn weer op :9

sig69 schreef op maandag 18 april 2005 @ 20:36:
Neuh, gewoon een lege aspx pagina die het plaatje binair schrijft met
C#:
1
2
3
4
5
// Finally, download it
Response.ClearHeaders();            
Response.AddHeader( "content-disposition","attachment; filename=" + filename );
Response.BinaryWrite( fileData ); // fileData is een byteArray uit de DB
Response.End();
Ik heb alleen ff geen code bij de hand, is alweer ff geleden.
Mja, eik zijn HttpHandlers hiervoor gemaakt. Deze hebben veel minder overhead dan Page :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:35
En, is het nu al gelukt ? :)

https://fgheysels.github.io/

Pagina: 1