Avatar billede Lars Søndergaard Nybegynder
08. maj 2006 - 17:45 Der er 12 kommentarer og
2 løsninger

vise et billede på web uden billede fil

jeg vil gerne hente mine images fra sql db og vise dem på web uden at gemme dem på serveren i filsystemet. Kan det lade sig gøre? og hvordan?
Avatar billede Lars Søndergaard Nybegynder
08. maj 2006 - 17:46 #1
jeg har selv styr på at hente mine billeder fra db, men det er resten jeg ikke ved
Avatar billede dr_chaos Nybegynder
08. maj 2006 - 17:58 #2
//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())
{
    Response.ContentType = dr["img_contenttype"].ToString();
    Response.BinaryWrite( (byte[]) dr["img_data"] );
}
connection.Close();
Avatar billede dr_chaos Nybegynder
08. maj 2006 - 17:58 #3
smides i page load
Avatar billede dr_chaos Nybegynder
08. maj 2006 - 17:58 #4
vises på denne måde:
<html>
<head><title>View Image from the database</title></head>
<body bgcolor=#FFFFFF>
  Here is the image, viewed from a database:<br />
  <img src="viewimage.aspx?img=1" border=1>
</body>
</html>
Avatar billede arne_v Ekspert
08. maj 2006 - 17:59 #5
jeg har et minimalistisk eksempel paa lager (lettere tilrettet):

<%@ import namespace="System.Data.SqlClient" %>
<script language="C#" runat="server">
private const string URLPREFIX = "http://localhost/getdb2.aspx?id=";
void Page_Load(Object sender, EventArgs e)
{
    string id = Request["id"];
    pic.Src = URLPREFIX + id;
}
</script>
<img id="pic" runat="server"/>

og

<%@ import namespace="System.Data" %>
<%@ import namespace="System.Data.SqlClient" %>
<script language="C#" runat="server">
private const string CONNSTR = "Server=ARNEPC3;Integrated Security=SSPI;Database=Test";
void Page_Load(Object sender, EventArgs e)
{
    string id = Request["id"];
    /**/
    SqlConnection con = new SqlConnection(CONNSTR);
    con.Open();
    SqlCommand sel = new SqlCommand("SELECT pic FROM od WHERE id = " + id, con);
    byte[] b = (byte[])sel.ExecuteScalar();
    con.Close();
    /**/
    /*
    byte[] b = (byte[])Cache.Get(id);
    if(b == null)
    {
        SqlConnection con = new SqlConnection(CONNSTR);
        con.Open();
        SqlCommand sel = new SqlCommand("SELECT pic FROM od WHERE id = " + id, con);
        b = (byte[])sel.ExecuteScalar();
        con.Close();
        Cache.Insert(id, b);
    }
    */
    Response.ContentType = "application/octet-stream";
    Response.AddHeader("Content-Disposition", "attachment; filename=\"" + id + ".pic\"");
    Response.BinaryWrite(b);
}
</script>
Avatar billede arne_v Ekspert
08. maj 2006 - 18:01 #6
(den udkommenterede cache kode kan fjerens)
Avatar billede dr_chaos Nybegynder
08. maj 2006 - 18:08 #7
princippet i de 2 eksempler er ens.
Arnes benytter bare cache.
Avatar billede Lars Søndergaard Nybegynder
08. maj 2006 - 19:53 #8
ok.. det ser fint ud.. jeg vil teste det.. MEN hvad hvis min situation er at jeg i min kode har et byte[] indeholdende image data og en kontrol med en ImageUrl ?? Er der en måde hvorpå jeg kan sætte ImageUrl med min byte[]

myimagebutton.ImageUrl = xxxxxxxxx noget med min byte[] ????
Avatar billede Lars Søndergaard Nybegynder
09. maj 2006 - 09:21 #9
måske forklarer jeg mig dårligt. det jeg mener er at jeg i min aspx.cs fil / klasse har et objekt som indeholder et image byte[] og hvis jeg skal loade det igen på URLPREFIX + id, er jeg nøst til at hente mit byte[] igen, og det giver bad performance.

Altså jeg har min kontrol med ImageUrl og jeg har mit byte[] i samme klasse. Er der ikke en anden måde at får det omdannet til et bilelde?
Avatar billede Lars Søndergaard Nybegynder
09. maj 2006 - 10:01 #10
smid et svar drenge.. i skal ikke holdes hen længere :)
Avatar billede dr_chaos Nybegynder
09. maj 2006 - 10:05 #11
ok
Kan du ikke bruge den løsning som arne benytter med caching ?
Avatar billede arne_v Ekspert
09. maj 2006 - 13:06 #12
jeg ligger et svar

når jeg kigger på min kode kommer jeg lidt i tvivl om hvorfor jeg har brugt
Response.ContentType = "application/octet-stream" og sætter Content-Disposition
fordi umiddelbart lyder Response.ContentType = "image/jpeg" (eller image/gif
eller image/png) og ingen Content-Disposition mere simpelt
mere rigtig
Avatar billede arne_v Ekspert
09. maj 2006 - 13:10 #13
IMG SRC tag læses af browseren i en seperat request

så du er nødt til at gemme dit byte[] i Cache eller Session eller noget
andet som bevares mellem requests
Avatar billede Lars Søndergaard Nybegynder
10. maj 2006 - 11:38 #14
jo jeg kan bruge den løsning med caching.. det er en udemærket idé :-) tak for hjælpen...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester