Správičky 2 270 Blogy 577 Fórum 14 074

Ako načítať a uložiť binárne dáta (obrázky) z a do databázy

spigi - 13. 2. 2003 16:34 - 8074 views

Raz za čas sa každý stretneme s problémom ukladania obrázkov do databázy a prípadne zobrazenia obrázkov uložených v DB na web stránke. V podstate je možné tento návod použiť na ľubovolné binárne dáta, nielen pre obrázky.

Ako musí vyzerať databázová tabuľka
Na SQL Serveri si vytvoríme ukážkovú tabuľku 'BinaryData', ktorá bude obsahovať tieto polia:
ID – Integer – identifikačné číslo (primárny kľúč)
Desc – NVarChar(50) – popis vložených dát
TypeOfData – NVarChar(50) – typ uložených dát (napr.: "image/jpeg")
BinData – Image – uložené binárne dáta

Postup ako uložiť dáta na SQL Server
Ako uploadneme súbor na server sme sa zoznámili v minolom článku na adrese http://www.aspnet.sk/articles.aspx?s=2&cat=5&articleID=6. Takže túto problematiku už nebude rozoberať. Ak sa zameriame na príklad (s rozdielom, že na stránku vložíme ešte jeden textbox s názvom TextBox1) z minulého článku, tak môžeme rozšíriť procedúru tlacitko_Click o nasledújúci kód:
'Načítame si všetky potrebné hodnoty
Dim _dataStream As Stream = subor.PostedFile.InputStream
Dim _dataLenght As Integer = subor.PostedFile.ContentLenght
Dim _dataType As String = subor.PostedFile.ContentType
Dim _dataDescription As String = TextBox1.Text.ToString
Dim _dataBinary() As Byte = New Byte(_dataLenght)
Dim _query As String 'na priebežné ukladanie dotazov

_dataStream.Read(_dataBinary,
0, _dataLenght)

'Tu je potrebné nastaviť správne Connection String na pripojenie na SQL Server
Dim _connection As SqlConnection = New SqlConnection(„connection_string_to_db“)

'A samotné ukladanie dát do DB :-)
_query = "INSERT INTO BinaryData(Desc, TypeOfData, BinData) VALUES (@desc, @typeofdata, @bindata)"
Dim _sqlCommand As SqlCommand = New SqlCommand(_query)

Dim paramDesc As SqlParameter = New SqlParameter("@desc",SqlDbType.VarChar,50)
paramDesc.Value
= _dataDescription
_sqlCommand.Parameters.Add(paramDesc)

Dim paramTypeOfData As SqlParameter = New SqlParameter("@typeofdata", SqlDbType.VarChar,50)
paramTypeOfData.Value
= _dataType
_sqlCommand.Parameters.Add(paramTypeOfData)

Dim paramBinData As SqlParameter = New SqlParameter("@bindata", SqlDbType.Image)
paramBinData.Value
= _dataBinary
_sqlCommand.Parameters.Add(paramBinData)

_connection.Open()
_sqlCommand.ExecuteNonQuery()
_connection.Close()
Takto máme uložené dáta, ktoré boli odoslané z web stránky na SQL Server, uložené v databáze. Teraz si ukážeme, ako tieto dáta z databázy prečítať a odoslať web browseru ako binárne dáta, určené pre download (obrázky a niektoré dokumenty sa zobrazujú priamo v prehladači).

Načítanie dát
Pri testovaní nezabudnite tejto stránke predať parameter za názvom "page.aspx?id=XXX", kde XXX je ID uložených dát z predchádzajúceho príkladu.
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim _idcko
As String = Request.QueryString("id")
    Dim _query
As String = "SELECT BinData, TypeOfData FROM BinaryData WHERE ID = " & _idcko
    Dim _connection
As SqlConnection = New SqlConnection(„connection_string_to_db“)

    Dim
command As SqlCommand = New SqlCommand(_query, _connection)

    _connection.Open()

    Dim dr
As SqlDataReader = command.ExecuteReader()

    If dr.Read()
Then
        
'Aby sa prehliadač dozvedel, aké sú to dáta, nastavíme ContentType
        Response.ContentType = dr("TypeOfData").ToString()

        
'Prípadne ešte môžeme nastaviť názov súboru, ktorý posielame prehliadaču...
        'je to dobré pokiaľ posielame nejaké dokumenty, zip súbory a podobne :-)
        Response.AddHeader("Content-Disposition", "attachment; filename=""subor.jpeg""")

        
'Musíme pretypovať dáta natiahnuté z DB opäť na typ Byte()!!!
        'a následne vypíšeme tieto dáta na výstup.
        Response.BinaryWrite(CType(dr("BinData"), Byte()))
    End
If
    _connection.Close()
End Sub
Takže asi takto nejako by to malo vyzerať. V podstate sme vybrali dáta z datového zdroja pomocom SQL príkazu SELECT a následne vypísali na výstup pomocou Response.BinaryWrite() ... (niečo podobné ako Response.Write()).

Ing. Igor Stanek, ASP.NET MVP, MCP

Som spoluzakladateľom a spolumajiteľom spoločnosti CHASTIA s.r.o., Poprad (www.chastia.com). V spoločnosti pôsobím ako konateľ a Software Architect.

Prevádzkujem internetový portál na online prevod jednotiek na internete www.prevody.sk a prvý internetový portál o technológii Microsoft .NET na Slovensku www.vyvojari.sk (bývalé www.AspNet.sk).

Som držiteľom certifikácie Microsoft Certified Professional a zo strany Microsoftu som už 6 rokov za sebou ocenený titulom Microsoft Most Valuable Professional za kompetenciu "ASP.NET/IIS".

Ďalšie info o mne nájdete na mojej osobnej stránke www.spigi.sk.

Článkov: 105, Správičiek: 13, Príspevkov vo fóre: 560, Príspevkov v blogu: 124, Bodov: 15560
Najaktívnejší č.: 3
Profil používateľa

Reakcie

Titulok:


Meno:


Url:
Koľko je 22 + 4? (ochrana proti spamu)

Komentár:


Najaktívnejší užívatelia
1. 35110 b. photo vlko
2. 16735 b. photo T
3. 15560 b. photo spigi
4. 6635 b. photo dudok
5. 5705 b. photo slavof
6. 5205 b. photo siro
7. 4745 b. photo duracellko
8. 3780 b. photo Liero
9. 3690 b. photo lubolacko
10. 3625 b. photo jakub