現在基於Web頁的HTML的編輯器在新聞系統
文章系統中用得越來越廣
一個網頁一粘就可以保持原來的樣式
同時圖片也可以在這個頁中保持
但是在使用過程中
如果所粘貼頁中的圖片被刪除
就會在自己的頁面上留下一個大大的
X
影響美觀
以前只好把這個圖片保存下來
再重新上傳到服務器上
這樣實在麻煩
能不能讓服務器自動去下載圖片保存在服務器並且替換頁面上的鏈接?答案是肯定的
要實現這個功能需要經過三個步驟
一
取得原頁中的圖片的地址
方法很多
可以用分割字符串
也可以用正則匹配
實踐證明用正則匹配最為簡單
經過分析圖片的地址都保存在<img>標簽中
我們可以先取得所有這個標簽
過程如下
Set objRegExp = New Regexp
設置配置對象
objRegExp
IgnoreCase = True
忽略大小寫
objRegExpGlobal = True
設置為全文搜索
objRegExp
Pattern =
<img
+?>
為了確保能准確地取出圖片地址所以分為兩層配置
首先找到裡面的<img>標簽
然後再取出裡面的圖片地址後面的getimgs函數就是實現後一個功能的
strs=trim(str)
Set Matches =objRegExp
Execute(strs)
開始執行配置
For Each Match in Matches
RetStr = RetStr &getimgs( Match
Value )
執行第二輪的匹配
Next
所有的圖片在裡面都是這樣的src=//圖片的地址
所以可以這樣來取得確切的圖片地址
function getimgs(str)
getimgs=
Set objRegExp
= New Regexp
objRegExp
IgnoreCase = True
objRegExp
Global = True
objRegExp
Pattern =
+?
取出裡面的地址
set mm=objRegExp
Execute(str)
For Each Match
in mm
getimgs=getimgs&
||
&left(Match
Value
len(Match
Value)
)
把裡面的地址串起來備用
next
end function
取得了所有的圖片的地址
我們就可以進行第二步的操作了
二
下載圖片並保存在服務器上
這個又可以分為兩個步驟
一個是取得圖片的內容
另一個是保存在服務器上
取得圖片的內容是通過下面的函數來實現的
function getHTTPPage(url)
on error resume next
dim http
set (
MSXML
XMLHTTP
)
使用xmlhttp的方法來獲得圖片的內容
Http
open
GET
url
false
Http
send()
if Http
readystate<>
then
exit function
end if
getHTTPPage=Http
responseBody
set http=nothing
if errnumber<>
then err
Clear
end function
取得了圖片的內容要保存
給人一種感覺是用FSO來作就可以了
但實際上不行
這樣保存程序就會出錯
因為FSO不支持流式的文件
所以我們要調用另一個對象
ADO
STREM
具體的過程如下
function saveimage(from
tofile)
dim geturl
objStream
imgs
geturl=trim(from)
imgs=gethttppage(geturl)
取得圖片的具休內容的過程
Set objStream = Server
CreateObject(
ADODB
Stream
)
建立ADODB
Stream對象
必須要ADO
以上版本
objStreamType =
以二進制模式打開
objStreamOpen
objstream
write imgs
將字符串內容寫入緩沖
objstream
SaveToFile server
mappath(tofile)
將緩沖的內容寫入文件
objstreamClose()
關閉對象
set objstream=nothing
end function
所以只要用一個循環來把剛才取得的地址中的圖片全部保存下來
具體過程如下
arrimg=split(retstr
||
)
分割字串
取得裡面地址列表
allimg=
newimg=
for i=
to ubound(arrimg)
if arrimg(i)<>
and instr(allimg
arrimg(i))<
then
看這個圖片是否已經下載過
fname=baseurl&cstr(i&mid(arrimg(i)
instrrev(arrimg(i)
)))
saveimage(arrimg(i)
fname)
保存地址的函數
過程見上面
allimg=allimg&
||
&arrimg(i)
把保存下來的圖片的地址串回起來
以確定要替換的地址
newimg=newimg&
||
&fname
把本地的地址串回起來
end if
next
第三步就是替換原來的地址了
具體的過程就是下面了
arrnew=split(newimg
||
)
取得原來的圖片地址列表
arrall=split(allimg
||
)
取得已經保存下來的圖片的地址列表
for i=
to ubound(arrnew)
執行循環替換原來的地址
strs=replace(strs
arrall(i)
arrnew(i))
next
cctv=strs
講到這裡
這個函數的基本過程就是這樣了
當然可以對它進行改造就可以實現更多的功能
如
加上圖片大小的限制
加上對本地機上的圖片下載的限制
以免造成重復下載圖片
同時也應該看到這個函數的不足之處是只能處理靜態的圖片文件
不能適用程序生成的圖片
From:http://tw.wingwit.com/Article/program/ASP/201311/21686.html