| 最近发现有个客户的网站占用资源特别高,他的access数据库文件已经高达450M了,经过查看,发现他的很多图片都保存在了数据库中,导致数据库文件过大。 这才想起来,以前经常看到有人图方便把图片放在数据库中,以前也没有想这样做有什么不好的,现在才发现,如果记录比较多,图片又大的话,数据库会很快膨胀起来的,看样子,在数据库中存图片还真不是个好主意。 为了解决这个问题,需要做2件事情,一个是把图片读出来存在某个指定的目录下,另一个就是在数据库中记录下存放地址和调用方式,后面的很简单,更改一下数据库记录就行了,前一面一个解决稍微麻烦点,要把二进制数据从数据库中读出并保存成文件。 客户的网站是基于asp+access的,网站本身支持FSO,据此写了以下代码,经过测试成功实现了从数据库中导出图片记录的要求。 下面是代码: <% Function getWebImages(url) dim http set http=server.createobject("MSXML2.XMLHTTP") Http.open "GET",url,false Http.send() if Http.readystate<>4 then exit function getHTTPimg=Http.responseBody set http=nothing end function Function SaveImg2Local(from,tofile) dim geturl,objStream,imgs geturl=trim(from) imgs=getWebImages(geturl) Set objStream = Server.CreateObject("ADODB.Stream") objStream.Type =1 objStream.Open objstream.write imgs objstream.SaveToFile tofile,2 objstream.Close() set objstream=nothing end function DBPath = "D:\Website\xxx.com\xxx.mdb" '这里是数据库的位置 DSN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBPath set conn=server.CreateObject("adodb.connection") conn.open DSN set rs=server.createobject("ADODB.recordset") sql="select newsid from news where not isnull(img)" '如果img字段不是空的就读出来 rs.open sql,conn,1,1 for n=1 to rs.recordcount call SaveImg2Local("http://www.xxx.com/showimg.asp?newsid="&rs("newsid"),server.MapPath(rs("newsid")&".jpg")) '以newsid号为文件名称进行保存 rs.movenext next rs.close set rs=nothing conn.close set conn=nothing %> 下面是showimg.asp的代码: <% DBPath = "D:\Website\xxx.com\xxx.mdb" '这里是数据库的位置 DSN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBPath set conn=server.CreateObject("adodb.connection") conn.open DSN set rs=server.createobject("ADODB.recordset") rs.open "select img from news where newsid=" & trim(request("newsid")),conn,1,1 Response.ContentType = "image/pjpeg" Response.BinaryWrite rs("img").getChunk(7500000) rs.close set rs=nothing conn.close set conn=nothing %> |