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