Þessa greina skrifaði ég 21.06.2002 og læt hana hér með flakka:

Þessi grein er svar við spurningu sem ég fékk senda í gærkvöldi.<br />Ég þyrfti samt að fá að vita hvernig maður setur myndir í gagnagrunn og hvernig maður lætur þær birtast aftur á annarri síðu en maður uploadar þeim. Er hægt að ákvarða stærð mynda í kb. ef einhver skyldi setja inn of stóra mynd?<br /><br />Þá er bara um að gera að svara.<br />1. Hvernig setur maður myndir í gagnagrunn og birtir þær?<br /><br />Til þess að koma myndinni inn á vefþjónin þarftu einhvern component (hlut) sem upload-ar myndinni/skránni. Hægt er að nota <a href=“”http://www.asphelp.com/ASPSimpleUpload/Default.Asp“” target=_blank“”> ASP Simple Upload</a>, en hann er einfaldur og frír. Ég ætla ekki að fara í hvernig á að nota hann þar sem aspHelp fer út í það og það er auðvelt að fikta sig áfram.<br /><br />Þegar þú ert kominn með það á hreint, þ.e.a.s búinn að fá hann til að virka og prófa þá getum við haldið áfram.<br /><br />Það eru tvær leiðir til þess að geyma mynd í gagnagrunn.<br />Sú fyrri og sú sem ég notast við oftast er að leifa notandanum að upload-a myndinni í folder á vefþjóninum og búa til dálk (field) í gagnagrunnstöflunni sem heitir URL, Path eða eitthvað svoleiðis. Það sem sá field gerir er semsagt að geyma slóðina af myndinni.<br /><br />Flestir com hlutir sem uploada gefa þér þann kost að taka nafnið af því sem var verið að uploada. Þá gætiru t.d. stillt að allir myndirnar eigi að fara í myndir/upload og svo tekið nafnið á myndinni þannig að öll slóðin væri t.d myndir/upload/fjolskyldan.jpg Þessa slóð getur síðan sett í töflu í gagnagrunninum sem geymir myndir og gæti litið einhvern veginn svona út.<br />ImageID: AutoNumber<br />Titill: Text<br />Lýsing: Text (sem gæti farið t.d í alt attribute-ið)<br />Slóð: Text<br /><br />Til þess að ná síðan myndinni út úr grunninum. Segjum t.d. fyrir mynda-albúm. Þá býr maður bara til tengingu, og recordsett og svo inn í skjalinu lætur maður recordsettið skrifa út slóðina í Image tag.<br /><blockquote>&lt;%<br />Response.Write(“”&lt;img src=“”“”“” & objRS(“”Slóð“” &“”“”“”&gt;“”)<br />%&gt;</blockquote><br />Hin aðferðin byggir á því að geyma myndina sem binary í grunninum. Þá gæti mynda taflan litið einhvern veginn svona út:<br />ImageID: AutoNumber<br />Titill: Text<br />Lýsing: Text<br />Mynd: Ole Object<br /><br />Til þess að sýna þessa mynd þurfum við að nýta okkur Repsonse.binaryWrite í ASP hlutanum þar sem myndin er raunverlega geymdí gagnagrunninum sem binary. Einfaldasta lausnin er að búa til ASP síðu sem hagar sér eins og mynd. Til þess að gera það stillum við ContentType-ið. Sem segir til hvernig skjal asp síðan eigi að haga sér eins og.<br /><blockquote>&lt;%<br />Response.ContentType = “”image/jpg“”<br />%&gt;</blockquote><br />Síðan sækjum við ID-á myndinni sem við ætlum að sækja úr grunninum og tengjust grunninum<br /><blockquote>&lt;%<br /> dim ImageID<br /> ImageID= Request.QueryString(“”ImageID“”)<br /> <br /> dim objConn<br /> set objConn = Server.createObject(“”ADODB.Connection“”)<br /> with objConn<br /> .ConnectionString = “”DSN=vefur“”<br /> .open<br /> end with<br /> <br /> dim strSQL<br /> strSQL = “”SELECT Mynd FROM Myndatafla WHERE ImageID= “” & ImageID<br /> <br /> dim objRS<br /> set objRS = Server.CreateObject(“”ADODB.Recordset“”)<br /> with objRS<br /> .CursorType = adOpenKeyset<br /> .CursorLocation = adUseClient<br /> .ActiveConnection = objConn<br /> .Source = strSQL<br /> .open<br /> end with<br />%&gt;</blockquote><br />Að lokum þurfum við síðan bara að skrifa út myndina sem binary<br /><blockquote>&lt;%<br />Response.binaryWrite objRS(“”Mynd“”)<br />%&gt;</blockquote><br />Og svo nátturlega að loka og hreinsa til eftir okkur, eins og góðum ASP-ara sæmir<br /><blockquote>&lt;%<br />objRS.close<br />set objRS = nothing<br /><br />objConn.close<br />set objConn = nothing<br />%&gt;</blockquote><br />Þessa síðu getum við síðan vistað sem SynaMynd.asp og notum hana svona.<br />&lt;img src=“”SynaMynd.asp?ImageID=2&gt;<br /><br />Trixið í að geyma myndina sjálfa í grunninum er að hafa asp síðu sem hagar sér eins og mynd. og láta ASP síðan skrifa út myndina á binary formatti. ASP síðan SynaMynd er því raunverlega JGP mynd en ekki ASP síða.<br /><br />Kostir og gallar<br />Hvor tveggja hefur sína kosti og galla. Þar sem við erum að vinna með vefinn virðist fyrri aðferðin meika meira sens. <br /><br />Einfaldega að geyma slóðina af myndinni í stað þess að geyma alla myndina í grunninum. Að geyma slóðina gerir grunninn í <br /><br />heildina mun minn og það er mun auðveldara að vinna með þær. Gallinn er að þú ert ekki með allt á einum stað, það er oft mun <br /><br />betra og þægilegra að hafa allt sem maður þarf á einum stað. Í stað þess að vera skipta þessu upp. T.d. þegar maður er að vinna á mörgum mismunandi serverum.<br /><br />2. Er hægt að ákvarða stærð mynda í kb. ef einhver skyldi setja inn of stóra mynd.<br /><br />Já, sumir com hlutir sem upload-a bjóða einfaldlega upp á að setja takmarkanir á hversu stór myndin megi vera.<br />Ef com hluturinn býður upp á þann möguleika er nátturlega einfaldast að nota hann.<br /><br />Önnur leið sem mér dettur strax í hug er að nota File System Objectinn til þess að lesa skránna sem hann upload-aði.<br /><blockquote>&lt;%<br />dim FSO, objFille, nSize<br />set FSO = Server.createObject(“”Scripting.FileSystemObject“”)<br />set objFile = FSO.getFile(“”nafniðámyndinni“”)<br />nSize = objFile.Size 'Stærðin í bætum<br />%&gt;</blockquote><br />Þá erum við komnir með stærðina á myndinni sem hann upload-aði. Núna þurfum við að athuga hvort hún sé of stór.<br /><blockquote>&lt;%<br />if (nSize > 300000) Then<br /> FSO.DeleteFile Server.mapPath(“”fjolskyla.jpg“”) <br /> Response.Write(“”Myndi var of stór og því hefur henni verið eytt“”)<br />else<br /> Response.write(“”Myndin var í réttri stærð og allt er í gúddí“”)<br />end if<br />%&gt;</blockquote><br /><br />Þá held ég barasta að þetta sé komið og eins og vanalega hvet ég alla til þess að hafa samband í gegnum spurningar@bergur.is ef það er eitthvað.<br /><br />Bergu