欢迎光临
我们一直在努力

新闻系统里防止产生垃圾图片的一种方法-ASP教程,ASP应用

建站超值云服务器,限时71元/月

现在的新闻系统里越多地支持在线上传插入图片,以实现在比较好的效果。可是问题也随之而来了,有的图片传上去后,发现这个图片不对,那只能在编辑器里把它删掉,或是,在添加地程中系统出现问题,而导致垃圾图片的产生。为了防止在这过程中出现垃圾图片和附件,许多人多研究了不少的方法,如动网论坛里,对上传的每一个文件,在数据库里都有相应的一个记录,这样要占用一个表来存放,并且如果在添加数据到数据库里时系统出现异常,也同样无法避免这些垃圾的产生。经过我的一些实践,研究出我的方法,现在贡献出来,供大家斧正。

我的方法流程是这样的:当文章的添加者登录到系统里面后,由系统给它创建一个临时的工作文件夹,如“editor”这个用户的id是5那我建立一个temp5的临时工作目录,当他添加文章的时候,上传的图片和其它附件并不存入到真正要显示存放的目录,而是存在这个临时的工作目录里面。同时为了方便管理,我建议给每一条新闻建一个目录来存放这些图片,当文章提交的时候,由系统分析里面的图片地址,把文章里面有的图片转移到这些对应的目录里面去。当新闻或文章改动的时候,就先把这个文件夹下面的所有图片转移到进入的时候的临时工作目录里面,同时对文章里面的图片路径进行替换,保存的时候也是和添加的时候执行同一个过程。当文章删除的时候,也相对应地把这个目录删掉,这就可以保证了在添加、修改、删除的过程中没有垃圾图片的产生。当用户登出的时候,系统可以将其所对应的工作目录删除,这样就可以彻底地作到没有垃圾的产生。

看到上面这些文字描述也许好多人要头晕了,那看一下具体的实现过程吧(因为我对asp比较熟悉,所以我用asp来实现它了,用其它的平台也是可以实现的)。首先让我先引入我自己写的一个类,用来分析和转移图片的,详细的说明请看我的另一篇文章:用asp自动解析网页中的图片地址,并将其保存到本地服务器(http://www.csdn.net/develop/read_article.asp?id=15585)

class blacksmith

the class "blacksmith" is created by linzhang chen

it could use for copy images form other server which contain in the web

dim size,baseurl,basefilename,tofolder,servername,processstr,firstoldimg,firstnewimg

public function saveimage(from, tofile)

dim geturl, objstream, imgs,s

if size = "" then

size = 0

end if

geturl = trim(from)

imgs = gethttppage(geturl)

s = size * 512

if len(imgs) > s then

set objstream = createobject("adodb.stream")

objstream.type = 1

objstream.open

objstream.write imgs

objstream.savetofile tofile, 2

objstream.close

set objstream = nothing

saveimage = true

else

saveimage = false

end if

end function

private function gethttppage(url)

on error resume next

dim http

set http = createobject("msxml2.xmlhttp")

http.open "get", url, false

http.send

if http.readystate <> 4 then

exit function

end if

gethttppage = http.responsebody

set http = nothing

if err.number <> 0 then err.clear

end function

private function getimgs(str)

getimgs = ""

set objregexp1 = new regexp

objregexp1.ignorecase = true

objregexp1.global = true

objregexp1.pattern = "http://.+?"""

set mm = objregexp1.execute(str)

for each match1 in mm

getimgs = getimgs & "||" & left(match1.value, len(match1.value) – 1)

next

end function

function str2img()

dim servername, objregexp, strs, matches, retstr, arrimg, newimg, i, fname, states, arrnew, arrall

if baseurl<>"" then

if right(baseurl, 1) <> "/" then

baseurl = baseurl & "/"

end if

end if

if right(tofolder,1)<>"\" then

tofolder=tofolder&"\"

end if

set objregexp = new regexp

objregexp.ignorecase = true

objregexp.global = true

objregexp.pattern = "<img.+?>"

strs = trim(processstr)

set matches = objregexp.execute(strs)

for each match in matches

retstr = retstr & getimgs(match.value)

next

arrimg = split(retstr, "||")

allimg = ""

newimg = ""

for i = 1 to ubound(arrimg)

if arrimg(i) <> "" and instr(allimg, arrimg(i)) < 1 then

fname1 = baseurl & cstr(basefilename & i & mid(arrimg(i), instrrev(arrimg(i), ".")))

fname = tofolder & cstr(basefilename & i & mid(arrimg(i), instrrev(arrimg(i), ".")))

states = saveimage(arrimg(i), fname)

if states = true then

allimg = allimg & "||" & arrimg(i)

newimg = newimg & "||" & fname1

end if

end if

next

arrnew = split(newimg, "||")

arrall = split(allimg, "||")

for i = 1 to ubound(arrnew)

if i=1 then

firstoldimg=arrall(1)

firstnewimg=arrnew(1)

end if

strs = replace(strs, arrall(i), arrnew(i))

next

str2img = strs

end function

end class

第一步用户登录的时候:由于有一个工作区,所以最好不要让多个用户用同一个帐号不然到时候有人登出的时候,将会造成其它人的工作丢失,这里最主要处理的是帐户登录的时候要对这个帐号锁定不允许重复登录(主要由fso和数据库来实现,我就不多说了)。

在处理文件上传的时候,可以用稻香老农的无组件上传,把图片传到工作区中。并且把图片代码返回到编辑器中,当提交以后,将由以下代码来处理这些图片,我这里是根据新闻或文章的id来创建文件夹的:

sql="select top 1 form news where id is null"

set rs=server.createobject("adodb.recordset")

rs.open sql,conn,1,3

rs.addnew

rs("userid")=session("myid")因为是新加的,所以先加上一条来取得id

rs.update

newid=rs("newsid")大部分情况下,这样可以取得id的,可是为了保险起见,所以最好还是再判断一下了

rs.close

set rs=nothing

if newsid="" then

set rs=conn.execute("select top 1 newsid from news where userid=" & session("myid") & " order by newsid desc")

newsid=rs("newsid")

end if

basefoder=server.mappath("photo")假设图片存到当前目录下面的photo里面

set fso=server.createobject("scripting.filesystemobject")

filepath = basefoder&"/"&newsid

fso.createfolder(filepath)

假设将取得新闻的内容存在变量content里面下面就调用我的那个类blacksmith来处理分析文章的内容,处理图片的转移了

set bs=new blacksmith

bs.size=1

bs.baseurl="photo/"&newsid给图片加上目录的地址

bs.basefilename="mynews"给图片加上前缀

bs.servername = ""

bs.tofolder=filepath

bs.processstr=content

content=bs.str2img

set bs=nothing

接下来就是新闻内容的保存的过程了,我这里就省去了,和其它的系统应该是一样的了

在处理新闻的修改的时候用:

创建工作目录

set fso=server.createobject("scripting.filesystemobject")

filepath = server.mappath("temp"&session("myid"))

if not fso.folderexists(filepath) then

fso.createfolder(filepath)

end if

filepath = basefoder&"/"&newsid

if fso.folderexists(fp) then

on error resume next

fso.copyfile fp&"\*.*",filepath&"\"把那个目录下面的所有文件全拷到工作目录下面,防止出现修改了不保存,所以先不删除原有的内容

if err.num>0 then err.clear

end if

set fso=nothing

end if

把原有的文件内容进行处理,改变里面的图片路径,比如说这此内容还是保存在content里面

content=replace(trim(content,"photo/"&newsid&"/mynews","temp"&session("myid")&"/mynews")这个只是一个比较简单的替换,相信由此引起误替换的机会应该是相当小的了

保存的过程和添加的过程是一样的,所不同的是,要先把原来的那个目录里面的文件清空,我这里就不多说了。

新闻删除的时候,要记着把这个id相对应的文件夹删除了,在用户登出的时候,也要把它的工作目录清空。

好了,我的整个思路就是这样的了,说不上是什么精品,但是它在实际的应用中,一年下来并没有产生过任何的意常,所以我就把它贴出来了,欢迎大家和我交流:e_mail:clzwin@sina.com

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 新闻系统里防止产生垃圾图片的一种方法-ASP教程,ASP应用
分享到: 更多 (0)