現(xiàn)在的新聞系統(tǒng)里越多地支持在線上傳插入圖片,以實(shí)現(xiàn)在比較好的效果。可是問題也隨之而來了,有的圖片傳上去后,發(fā)現(xiàn)這個圖片不對,那只能在編輯器里把它刪掉,或是,在添加地程中系統(tǒng)出現(xiàn)問題,而導(dǎo)致垃圾圖片的產(chǎn)生。為了防止在這過程中出現(xiàn)垃圾圖片和附件,許多人多研究了不少的方法,如動網(wǎng)論壇里,對上傳的每一個文件,在數(shù)據(jù)庫里都有相應(yīng)的一個記錄,這樣要占用一個表來存放,并且如果在添加數(shù)據(jù)到數(shù)據(jù)庫里時系統(tǒng)出現(xiàn)異常,也同樣無法避免這些垃圾的產(chǎn)生。經(jīng)過我的一些實(shí)踐,研究出我的方法,現(xiàn)在貢獻(xiàn)出來,供大家斧正。
我的方法流程是這樣的:當(dāng)文章的添加者登錄到系統(tǒng)里面后,由系統(tǒng)給它創(chuàng)建一個臨時的工作文件夾,如“editor”這個用戶的ID是5那我建立一個temp5的臨時工作目錄,當(dāng)他添加文章的時候,上傳的圖片和其它附件并不存入到真正要顯示存放的目錄,而是存在這個臨時的工作目錄里面。同時為了方便管理,我建議給每一條新聞建一個目錄來存放這些圖片,當(dāng)文章提交的時候,由系統(tǒng)分析里面的圖片地址,把文章里面有的圖片轉(zhuǎn)移到這些對應(yīng)的目錄里面去。
當(dāng)新聞或文章改動的時候,就先把這個文件夾下面的所有圖片轉(zhuǎn)移到進(jìn)入的時候的臨時工作目錄里面,同時對文章里面的圖片路徑進(jìn)行替換,保存的時候也是和添加的時候執(zhí)行同一個過程。當(dāng)文章刪除的時候,也相對應(yīng)地把這個目錄刪掉,這就可以保證了在添加、修改、刪除的過程中沒有垃圾圖片的產(chǎn)生。當(dāng)用戶登出的時候,系統(tǒng)可以將其所對應(yīng)的工作目錄刪除,這樣就可以徹底地作到?jīng)]有垃圾的產(chǎn)生。
看到上面這些文字描述也許好多人要頭暈了,那看一下具體的實(shí)現(xiàn)過程吧(因?yàn)槲覍SP比較熟悉,所以我用ASP來實(shí)現(xiàn)它了,用其它的平臺也是可以實(shí)現(xiàn)的)。首先讓我先引入我自己寫的一個類,用來分析和轉(zhuǎn)移圖片的,詳細(xì)的說明請看我的另一篇文章:用asp自動解析網(wǎng)頁中的圖片地址,并將其保存到本地服務(wù)器( http://m.wsalc.com/InfoShow.asp?id=214 )
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
第一步用戶登錄的時候:由于有一個工作區(qū),所以最好不要讓多個用戶用同一個帳號不然到時候有人登出的時候,將會造成其它人的工作丟失,這里最主要處理的是帳戶登錄的時候要對這個帳號鎖定不允許重復(fù)登錄(主要由FSO和數(shù)據(jù)庫來實(shí)現(xiàn),我就不多說了)。
在處理文件上傳的時候,可以用稻香老農(nóng)的無組件上傳,把圖片傳到工作區(qū)中。并且把圖片代碼返回到編輯器中,當(dāng)提交以后,將由以下代碼來處理這些圖片,我這里是根據(jù)新聞或文章的ID來創(chuàng)建文件夾的:
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")'因?yàn)槭切录拥模韵燃由弦粭l來取得ID
rs.update
newID=rs("newsid")'大部分情況下,這樣可以取得ID的,可是為了保險(xiǎn)起見,所以最好還是再判斷一下了
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")'假設(shè)圖片存到當(dāng)前目錄下面的photo里面
set fso=Server.CreateObject("Scripting.FileSystemObject")
FiLePaTh = basefoder&"/"&newsID
Fso.Createfolder(FiLePaTh)
'假設(shè)將取得新聞的內(nèi)容存在變量content里面下面就調(diào)用我的那個類blacksmith來處理分析文章的內(nèi)容,處理圖片的轉(zhuǎn)移了
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
'接下來就是新聞內(nèi)容的保存的過程了,我這里就省去了,和其它的系統(tǒng)應(yīng)該是一樣的了
在處理新聞的修改的時候用:
'創(chuàng)建工作目錄
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&"\"'把那個目錄下面的所有文件全拷到工作目錄下面,防止出現(xiàn)修改了不保存,所以先不刪除原有的內(nèi)容
if err.num>0 then err.clear
End If
set fso=nothing
end if
'把原有的文件內(nèi)容進(jìn)行處理,改變里面的圖片路徑,比如說這此內(nèi)容還是保存在content里面
content=replace(trim(content,"photo/"&newsID&"/mynews","temp"&session("myid")&"/mynews")'這個只是一個比較簡單的替換,相信由此引起誤替換的機(jī)會應(yīng)該是相當(dāng)小的了
保存的過程和添加的過程是一樣的,所不同的是,要先把原來的那個目錄里面的文件清空,我這里就不多說了。
新聞刪除的時候,要記著把這個ID相對應(yīng)的文件夾刪除了,在用戶登出的時候,也要把它的工作目錄清空。
好了,我的整個思路就是這樣的了,說不上是什么精品,但是它在實(shí)際的應(yīng)用中,一年下來并沒有產(chǎn)生過任何的意常,所以我就把它貼出來了,歡迎大家和我交流: E_mail:clzwin@sina.com