现在基于Web页的HTML的编辑器在新闻系统
文章系统中用得越来越广
一个网页一粘就可以保持原来的样式
同时图片也可以在这个页中保持
但是在使用过程中
如果所粘贴页中的图片被删除
就会在自己的页面上留下一个大大的
X
影响美观
以前只好把这个图片保存下来
再重新上传到服务器上
这样实在麻烦
能不能让服务器自动去下载图片保存在服务器并且替换页面上的链接?答案是肯定的
要实现这个功能需要经过三个步骤
一取得原页中的图片的地址方法很多可以用分割字符串也可以用正则匹配实践证明用正则匹配最为简单经过分析图片的地址都保存在<img>标签中我们可以先取得所有这个标签过程如下
Set objRegExp = New Regexp设置配置对象
objRegExpIgnoreCase = True忽略大小写
objRegExpGlobal = True设置为全文搜索
objRegExpPattern = <img+?>为了确保能准确地取出图片地址所以分为两层配置首先找到里面的<img>标签然后再取出里面的图片地址后面的getimgs函数就是实现后一个功能的
strs=trim(str)
Set Matches =objRegExpExecute(strs)开始执行配置
For Each Match in Matches
RetStr = RetStr &getimgs( MatchValue )执行第二轮的匹配
Next
所有的图片在里面都是这样的src=//图片的地址所以可以这样来取得确切的图片地址
function getimgs(str)
getimgs=
Set objRegExp = New Regexp
objRegExpIgnoreCase = True
objRegExpGlobal = True
objRegExpPattern = +?取出里面的地址
set mm=objRegExpExecute(str)
For Each Match in mm
getimgs=getimgs&||&left(MatchValuelen(MatchValue))把里面的地址串起来备用
next
end function
取得了所有的图片的地址我们就可以进行第二步的操作了
二下载图片并保存在服务器上这个又可以分为两个步骤一个是取得图片的内容另一个是保存在服务器上取得图片的内容是通过下面的函数来实现的
function getHTTPPage(url)
on error resume next
dim http
set (MSXMLXMLHTTP)使用xmlhttp的方法来获得图片的内容
Httpopen GETurlfalse
Httpsend()
if Httpreadystate<> then
exit function
end if
getHTTPPage=HttpresponseBody
set http=nothing
if errnumber<> then errClear
end function
取得了图片的内容要保存给人一种感觉是用FSO来作就可以了但实际上不行这样保存程序就会出错因为FSO不支持流式的文件所以我们要调用另一个对象ADOSTREM具体的过程如下
function saveimage(fromtofile)
dim geturlobjStreamimgs
geturl=trim(from)
imgs=gethttppage(geturl)取得图片的具休内容的过程
Set objStream = ServerCreateObject(ADODBStream)建立ADODBStream对象必须要ADO 以上版本
objStreamType =以二进制模式打开
objStreamOpen
objstreamwrite imgs将字符串内容写入缓沖
objstreamSaveToFile servermappath(tofile)将缓沖的内容写入文件
objstreamClose()关闭对象
set objstream=nothing
end function
所以只要用一个循环来把刚才取得的地址中的图片全部保存下来具体过程如下
arrimg=split(retstr||)分割字串取得里面地址列表
allimg=
newimg=
for i= to ubound(arrimg)
if arrimg(i)<> and instr(allimgarrimg(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(strsarrall(i)arrnew(i))
next
cctv=strs
讲到这里这个函数的基本过程就是这样了当然可以对它进行改造就可以实现更多的功能如加上图片大小的限制加上对本地机上的图片下载的限制以免造成重复下载图片同时也应该看到这个函数的不足之处是只能处理静态的图片文件不能适用程序生成的图片