Entwickler-Ecke

ASP.NET und Web - Bilder in DataList anzeigen lassen


Dark_rider - Sa 28.06.08 14:13
Titel: Bilder in DataList anzeigen lassen
Hi!
Ich möchte mit einer DataList (oder ähnliches) Bilder von der Datenbank anzeigen lassen. Aber, wie funktioniert das eigentlich? Der Code der DataList auf der Webseite sieht so aus:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
 <asp:DataList ID="DataList1" runat="server" CaptionAlign="Top" 
            DataKeyField="Bild" DataSourceID="VorlesungsSource" BackColor="#DEBA84" 
            BorderColor="#DEBA84" BorderStyle="None" BorderWidth="1px" CellPadding="3" 
            CellSpacing="2" GridLines="Both" RepeatColumns="3" RepeatDirection="Horizontal">
            <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" />
            <ItemStyle BackColor="#FFF7E7" ForeColor="#8C4510" />
            <SelectedItemStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" />
            <ItemTemplate>
                Bild:
                <asp:image ID="Bildimage" runat="server" imageurl='<%# ShowImage(Eval("Bild")) %>' Width="50" Height="50" />
                
                Titel:
                <asp:Label ID="TitelLabel" runat="server" Text='<%# Eval("Titel") %>' />
                
                Datum:
                <asp:Label ID="DatumLabel" runat="server" Text='<%# Eval("Datum") %>' />
                
                Bemerkung:
                <asp:Label ID="BemerkungLabel" runat="server" Text='<%# Eval("Bemerkung") %>' />
                
            </ItemTemplate>
        </asp:DataList>


Bei dem Image rufe ich eine Methode ShowImage auf. Der C#-Code dazu sieht folgendermaßen aus:

C#-Quelltext
1:
2:
3:
4:
5:
 public String ShowImage(object o)
    {
                
        return "http://localhost:50549/Kinderuni_v01/ShowImage.aspx?ShowImage=";
    }


Ich rufe die Seite ShowImage auf, die mir das Bild aus der Datenbank holen soll. Der Code zu der Seite sieht so aus:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
   protected void Page_Load(object sender, EventArgs e)
    {
        String value = this.Request.QueryString.Get("showImage");
        KUDBDataContext db = new KUDBDataContext();

        var fotos = (from f in db.Fotos
                     select f);

        byte[] buffer = null;

        foreach (Foto foto in fotos)
        {

            buffer = foto.Bild.ToArray();
           
        }

        Response.ContentType = "image/jpeg";
        Response.BinaryWrite(buffer);
    }


Das Problem ist jetzt, dass immer das gleiche Bild in allen Feldern angezeigt wird. Ich müsste praktisch die ID des Fotos irgendwie mit übergeben und anhand der ID das jeweilige Bild aus der Datenbank holen, oder? Aber, wenn das so ist, dann weiß ich nicht, wie ich das jetzt machen soll. Kann mir einer sagen, wie das funktioniert? Oder kennt vielleicht noch jemand eine andere Methode Bilder aus der Datenbank anzeigen zu lassen?

Danke im Voraus!


Kha - Sa 28.06.08 19:49

Wäre es denn nicht um Weiten einfacher, wenn du in der DB einfach nur den Pfad zum Bild speicherst? Gerade bei Webseiten bietet sich das imHo an.


Dark_rider - Di 01.07.08 13:39

Hi!
Klingt eigentlich einfach, aber ich kenne mich noch nicht so gut damit aus. Wie würde das dann aussehen, konkret?

Danke im Voraus!


Kha - Di 01.07.08 16:26

Naja, du änderst den Typ deiner "Bild"-Column auf NVarChar(xyz) :gruebel: :mrgreen: . Dann musst du natürlich alle Bilder in einer geeigneten Ordnerstruktur verwalten. Wenn die Pfade in der DB schon relative sind, sollte in der .aspx dann imageurl='<%# Eval("Bild") %>' genügen.


Dark_rider - Di 01.07.08 16:28

Hi!
Aber müssen Bilder nicht in einem Byte-Array in der Datenbank abgespeichert werden?


Kha - Mi 02.07.08 16:21

Äh, ich habe doch vorgeschlagen, das eben nicht so zu machen. Natürlich könnte man es irgendwie hinbiegen, dass die URL "/Pics/1.jpg" auf den richtige DB-Eintrag umgeleitet wird und dabei auch nicht der Cache (Client & Server) versagt, aber am einfachsten ist es doch, wenn hinter jeder URL auch eine physische Datei steckt. Und die DB nur noch die Pfade enthält.