Just nu i M3-nätverket
Gå till innehåll

Lagra bilder i SQL


Simon Johansson

Rekommendera Poster

Simon Johansson

Hur ska man på ett smidigt sätt med ASP få en bild som ligger på en webbserver att lagras i en SQL-databas, och sedan kunna visas?

 

/s

 

 

========================================

Simon Johansson

Redaktör för Eforum

Simon.Johansson@idg.se

Länk till kommentar
Dela på andra webbplatser

Simon Johansson

 

Enklast är att lagra bilden på webservern och endast lagra en länk till bilden i databasen.

 

Well, it's för enkelt för mig.

 

Nejdå, men jag ska prompt ha in bilden i en databas.

 

Såhär:

 

Jag har en bild som heter typ image.jpg, som ligger på webbservern. Det är till en webbkamera, så jag har i dag en Iframe som uppdateras varannan sekund, men nu vill jag att den istället laddas upp i en databas och visas varannan sekund...

 

Onödigt? Kanske, men så ska jag ha det i alla fall... ;)

 

/s

 

========================================

Simon Johansson

Redaktör för Eforum

Simon.Johansson@idg.se

 

Länk till kommentar
Dela på andra webbplatser

Enklast är väl att göra som grabbarna säger och lagra bildnamnet eller som länk, och ladda upp bilden till en image-mapp på servern istället??

 

 

Länk till kommentar
Dela på andra webbplatser

Simon Johansson

 

Äh. Nu har jag bestämt mig. Och jag är jävligt envis. :)

 

Nej, men allvarligt talat. Jag vet mycket väl att jag kan lagra URL:en bara, men så skall icke ske, ty omständigheterna kräva denna lösning.

 

Så hjälp mig nu!

 

Jag vet inte om det fungerar, men jag vill ha egentligen typ såhär (det här är ingen riktig kod, utan bara för att visa er):

 

I iframen image.asp:

 

<meta refresh=image.asp 2sec>

<asp-kod som tar bilden image.jpg och lägger upp i en sqldatabas som blob>

<img src=fil.asp som i sin tur plockar ur blobben från databasen>

 

Capisce?

 

/s

 

 

========================================

Simon Johansson

Redaktör för Eforum

Simon.Johansson@idg.se

 

Länk till kommentar
Dela på andra webbplatser

Simon Johansson

 

Alltså vi har lastbalanserade servrar, så filerna måste replikeras ut, laddar man upp bilden till en server syns den inte på alla andra innan man replikerar.

 

Därför MÅSTE bilden lagras i en databas för att man ska kunna ha en frekvens på en bild varannan sekund.

 

/s

 

========================================

Simon Johansson

Redaktör för Eforum

Simon.Johansson@idg.se

 

Länk till kommentar
Dela på andra webbplatser

Det är inga problem att lagra bilder i databaser. Det du kan göra för att vara säker på att datat inte går förlorat är att base64 encoda datat innan du lägger in det.

 

Det finns komponenter som fixar både uppladdning av filer och komponenter som tar hand om base64.

 

-Bj

 

Länk till kommentar
Dela på andra webbplatser

johan pålsson

Hej !

 

Du behöver inte lägga filen i en databas bara för det, lägg filerna i en mapp på en gemensam filhanterare och dela ut den till alla webservrar.

 

Det kanske inte spelar så stor roll i det här fallet (liten jpg-fil) men ju större filer man vill spara, desto sämre verkar det att vara att ersätta filhanteraren med SQL-server ur prestandasynpunkt.

 

/Johan

 

Länk till kommentar
Dela på andra webbplatser

Jag tror tyvärr att det är svärt att lösa det hela direkt från ASP efter som du bara kan avända datatypen variant. Jag har gjort en motsvarande lösning med då använde jag en COM-komponent på webbservern. (Egentligen är det flera komponenter i olika lager men det spelar ingen roll för principen är den samma)

 

För att läsa upp en bild:

---

dim cn as new adodb.connection

dim rs as adodb.recordset

dim arrByte() As Byte

 

cn.open myConnectionString

 

set rs = cn.execute("Select fldImage From tblImageStore")

 

arrByte = (rs!fldImage)

 

cn.close

 

Open "c:\inetpub\wwrott\media\images\webcamout.jpg" For Binary Access Write As #1

 

Put 1, , arrByte()

 

Close #1

---

1. Komponenten läser upp bilden som en byte-array från databasen.

2. En fil med skapas i en katalog som webbserven kommer åt. Jag använder vanliga filobjektet i VB.

3. Byte-arrayn skrivs till filen.

 

När användaren avslutar sessionen körs även ett "Event" och den temporära filen tas bort från hårddisken på webbservern. Detta visas inte i kodexemplet

 

För att spara en bild i databasen:

---

Dim cn as new adodb.connection

Dim arrByte() As Byte

 

Open "c:\inetpup\wwwroot\media\images\webCam.jpg" For Binary Access Read Lock Read As #1

 

ReDim arrByte(LOF(1) - 1)

 

Get 1 , arrByte()

 

Close #1

 

cn.open myConnectionString

 

cn.Exceute "Insert tblImageStore Values (" & arrByte & ")"

 

cn.close

---

1. Öppna bildfilen och läs in bilden som en byte array

2. Spara byte-arrayn i databasen. Egentligen använder jag en lagrad procedur för detta men för tydlighetens skull så...

 

Om jag inte minns fel så använder jag datatypen Image i min SQL-server 2000 databasen.

 

När man skall visa upp en bild kräver denna lösning att man "mellanlagrar" bild filen på webbservern. Filhantering påverkar alltid prestanda, så beroende på hur belastning och användadet ser ut på webbservern bör man nog vara lite försikt med att använda denna lösning.

 

*** Uppdatering ****

Kolla Erik Junesjös inlägg för förslag på en evetuellt bättre lösning vad gäller att visa bilder

***

 

Handlar det bara om att spara en bild till databasen är det nog inga problem men det är flera hundra användare som samtidigt skall hämta upp sin egen personliga bild skulle jag definitivt lösa det hela på ett annat sätt.

 

Som tidigare nämnts finns det andra bra sätt att lösa ditt problem med lastbalanserade servrar utan att behöva lagra bilden i databasen.

 

[inlägget ändrat 2001-10-25 09:42:43 av PJL]

[inlägget ändrat 2001-10-25 09:51:00 av PJL]

Länk till kommentar
Dela på andra webbplatser

Erik Junesjö

Hej Simon!

Det är en bra fråga. Den bästa lösningen på ditt problem är att spara bilden i en s.k. blob. Här är två artiklar om hur du gör det.

http://www.planet-source-code.com/xq/ASP/txtCodeId.22/lngWId.4/qx/vb/scripts/ShowCode.htm

 

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsqlmag01/html/blob.asp

 

 

/Erik

 

Länk till kommentar
Dela på andra webbplatser

Erik Junesjö

Jag hittade den här kodsnutten som visar hur man hämtar ner bilden från databasen.

 

  <%@ LANGUAGE="VBSCRIPT" %>
  <%
  ' Clear out the existing HTTP header information
  Response.Expires = 0
  Response.Buffer = TRUE
  Response.Clear

  ' Change the HTTP header to reflect that an image is being passed.
  Response.ContentType = "image/gif"

  Set cn = Server.CreateObject("ADODB.Connection")
  ' The following open line assumes you have set up a System DataSource
  ' by the name of myDSN.
  cn.Open "Provider=SQLOLEDB; Data Source=server9; Initial Catalog=pubs; User ID=sa; Password="
  Set rs = cn.Execute("SELECT logo FROM pub_info WHERE pub_id='0736'")
  Response.BinaryWrite rs("logo")
  Response.End
  %>

 

Spara detta som en fil och anropa den med <img src="filnamn.asp">

 

/Erik

 

Länk till kommentar
Dela på andra webbplatser

Det verkar vara en smidig lösning för att visa bilder. Dock gällde väl frågan även hur man gör för att spara en bild i databasen.

 

Dessutom är det aldrig bra, av flera skäl, att göra databasanrop direkt från ASP. Det man skulle kunna göra är att flytta över just databasanropet till en komponent men behålla resten i ASP.

 

 

 

 

[inlägget ändrat 2001-10-25 09:47:41 av PJL]

Länk till kommentar
Dela på andra webbplatser

Tjo!

 

Först måste du he en kolumn i din tabell som kan spara binära "blobbar". Det finns en datatyp som heter "Image" som jag har använt tidigare för detta ändamål.

 

För att skicka upp bilderna kan du använda dig av SA-FileUp - www.softartisans.com. Det finns väldokumenterat hur man gör i deras exempel!

 

För att visa upp bilden använder du "Blobb" i ADO. Där kan du hämta ut bilden och visa upp den genom att köra en BinaryWrite. Lätt som en plätt.

 

Lycka till!

 

 

 

Länk till kommentar
Dela på andra webbplatser

1) Använd SQL Server 2000

 

2) Skiv en stored proedure för all databas access

 

3) Skriv en komponent för ASP sidan

 

4) Tänk efter n-o-g-a om du verkligen inte ska lagra bara filnamnet

 

/C

 

Länk till kommentar
Dela på andra webbplatser

Jag letade som du också efter ett sätt att lagra bilder till en databas. Det mesta som jag hittade var en massa komponenter som man var tvungen att köpa som också hade en massa finesser. Men till sist hittade jag en sida som enkelt(även jag fattade det) förklarade hur man kunde göra det.

 

http://www.asp101.com/articles/jacob/scriptupload.asp

 

Hoppas att det här löser ditt problem.

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...