Man kann Bilder in der Datenbank speichern. Es gibt Gründe die dafür sprechen und welche dagegen. Dies soll dieser Artikel nicht erörtern.
Zunächst erzeugen Sie eine Tabelle im SQL Server mit einem Feld vom Typ Image. Das Problem ist, das SQLDatasource diesen Type nicht verarbeiten kann. Also muss ein Umweg über das ObjectDatasource Control gewählt werden. Um ohne Code auszukommen erzeuge ich eine Typed Dataset (XSD) im app_code Folder. Dieses kapselt nur den Zugriff auf die Tabelle.
Das Gridview Control entält im EditItemtemplate eine Spalte mit dem Fileupload Control. Um das Bild zu speichern hänge ich mich in die Methode Itemupdating des Formview (oder Gridview) Controls. Dort wird der Uplaod Stream einfach dem Update Parameter zugewiesen.
Protected Sub FormView1_ItemUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.FormViewUpdateEventArgs)
Dim myup As FileUpload = CType(FormView1.Row().FindControl("fileupload1"), FileUpload)
Try
Dim ImageStream As IO.Stream = myup.PostedFile.InputStream
Dim lang As Integer = myup.PostedFile.ContentLength
Dim ImageContent(lang) As Byte
ImageStream.Read(ImageContent, 0, lang)
e.NewValues.Item("Bild") = ImageSream
Catch
End Try
End Sub |
Um zu verhinder das ein leeres Fileupload Control beim Update des Datensatzes das Bild überschreibt wurde das XSD per Editor verändert und eine SQLAbfrage eingefügt die das verhindert.
[Bild] =COALESCE(@Bild,bild) |
Um das Bild anzeigen verwendet man üblichwerweise einen ASHX handler. Der folgende Code ist in der ASHX Datei und nutzt das Typed Dataset um an die Daten zu kommen.
Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
context.Response.ContentType = "image/jpeg"
context.Response.Cache.SetCacheability(HttpCacheability.Public)
context.Response.BufferOutput = False
Dim stream As IO.Stream = Nothing
Try
If Not (context.Request.QueryString("ID")) Is Nothing Then
Dim myDA As New aDSMitarbeiterTableAdapters.MitarbeiterTableAdapter
Dim dt As aDSMitarbeiter.MitarbeiterDataTable = myDA.GetDataBy(context.Request.QueryString("ID"))
Dim bild As Byte() = dt.Rows(0).Item("bild")
HttpContext.Current.Response.BinaryWrite(bild)
End If
Catch
End Try
End Sub |
Die Anzeige im Gridview erfolgt dann in etwa mit <img src=bild.ashx?id=bild1>.