Zobrazení obrázku z grid view   otázka

ASP.NET WebForms

Dobrý den, potřeboval bych poradit jak zobrazit obrázek z databáze pomocí gridview. Mám udělané gridview, kde zobrazuji seznam knih v databázi je poly typu image a já bych chtěl zobrazit k danému záznamu obrázek pokud existuje. Když jsem si nechal stránku zobrazit tak se mi místo obrázku zobrazilo System.Byte[]. Znamená to, že musí nějak informaci z databáze překonvertovat?

Děkuji.

Jaroslav

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je nutné si uvědomit, že obrázek do HTML stránky dostanete přes vložení značky

<img src="adresa obrázku" alt="popis" />

.

Jiné spolehlivé a obecně používané řešení není. Pokud neznáte HTML, naučte se ho, jinak nemá cenu s ASP.NET pracovat. Zjistěte si také, co je to HTTP a Content Type, pokud to nevíte, tohle jsou základní věci. Většina článků a materiálů předpokládá jejich znalost.

Pokud se tedy prokousáme tímhle, dojde nám, že bajty obrázku nemůžeme poslat do stránky s tabulkou, ale musíme vytvořit speciální stránku, které řekneme, jaký obrázek chceme, a ona nám ho pošle. Tuto speciální stránku je velmi vhodné koncipovat jako handler, tj. jednoduchá třída, které dostane požadavek a vystaví na něj odpověď.

Do projektu si tedy přidáte položku typu Generic Handler a do metody ProcessRequest napíšete něco takového:

'vytáhnout informace o příloze
Using con As New SqlConnection(ConfigurationManager.ConnectionStrings("DB").ConnectionString)
    Using com As New SqlCommand("SELECT Obrazek FROM Uzivatele WHERE id = @iduziv", con)
        com.Parameters.AddWithValue("iduziv", Request.QueryString("id"))    'do dotazu dosadit jako hodnotu parametru iduziv hodnotu parametru id z URL
        con.Open()
        Dim r As SqlDataReader = com.ExecuteReader()   'spustit dotaz
        If r.Read() Then     'pokud je vrácen výsledek
            'nastavit hlavičky
            context.Response.ContentType = "image/jpeg"
        
            'poslat data
            Dim bajty() As Byte = r("Obrazek")
            context.Response.OutputStream.Write(bajty, 0, bajty.Length)

        Else                 'obrázek nenalezen
            Throw New HttpException(404, "Not found")
        End If
        
        con.Close()
    End Using
End Using     

Píšu to z hlavy, snad to bude správně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jeste takovej postreh, tady by se vyplatilo po nacteni obrazku z databaze ho rovnou ukladat do cache a vyrazne tim urychlit opakovane zobrazeni obrazku, coz zrychly celkove i cas zobrazeni stranky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tohle si většinou řeší prohlížeče samy, je ovšem možné udělat cache i na straně webserveru, aby se obrázky pořád netahaly z db na webserver. Obecn ukládání obrázků do DB nemám moc rád, je s tím vždycky víc sena, ale někdy je to potřeba (třeba když máte databázi už od zákazníka hotovou a nesmíte ji měnit).

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback