防止新聞系統裡產生垃圾圖片的方法

來源:互聯網
上載者:User
現在的新聞系統裡越多地支援線上上傳插入圖片,以實現在比較好的效果。可是問題也隨之而來了,有的圖片傳上去後,發現這個圖片不對,那隻能在編輯器裡把它刪掉,或是,在添加地程中系統出現問題,而導致垃圾圖片的產生。為了防止在這過程中出現垃圾圖片和附件,許多人多研究了不少的方法,如動網論壇裡,對上傳的每一個檔案,在資料庫裡都有相應的一個記錄,這樣要佔用一個表來存放,並且如果在添加資料到資料庫裡時系統出現異常,也同樣無法避免這些垃圾的產生。經過我的一些實踐,研究出我的方法,現在貢獻出來,供大家斧正。

我的方法流程是這樣的:當文章的添加者登入到系統裡面後,由系統給它建立一個臨時的工作資料夾,如“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 = ""
   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



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。