如果你有两个空间,一个大而慢,另外一个小而快,或者其中一个不支持fso,那么跨服务器上传文件这个问题就摆在你面前了,下面就是我在解决ylog.net里面的跨服务器上传文件的日记,这个问题看似简单,里面的细节问题却是非常有趣
前提条件,空间都必须支持asp,上传文件的服务器支持fso,下面的叙述中,diygame.com为存上传文件的服务器,ylog.net为网站服务器,即显示用户界面的服务器…
实现功能,文件上传,上传后在网页的文本区域自动加上对于图片的ubb码,为了清楚,下面列出所有用到的文件
服务器 文件名 用途
diygame.com blog_upfile.asp 接收上传文件用
ylog.net blog_add.asp 添加blog,上传文件功能在此出现
ylog.net blog_upload.asp 上传文件表单,以iframe的形式嵌在blog_add.asp里
ylog.net blog_upresult.asp 显示上传结果,作善后工作
ylog.net blog_upcheck.asp 验证用户名与密码
在发布blog页面blog_add.asp增加一个iframe,调用blog_upload.asp进行上传操作
<iframe border="0" frameborder="0" framespacing="0" height="25" marginheight="0" marginwidth="0" noresize scrolling="no" width="100%" vspale="0" src="blog_upload.asp"></iframe>
如果你玩过asp,自然不费吹灰之力想到,文件要传到另外一个服务器上,只要把blog_upload.asp里的上传form的action页面指向目标服务器就行了,
<form name="form" method="post" action="http://www.diygame.com/blog_upfile.asp"
//中间略去
//提交时把发布blog的按纽disable先,以免没传完就时用户把blog发表了
<input type="submit" class=button name="submit" value=" 上 传 " onclick="parent.document.frmannounce.submit.disabled=true">
测试一下,文件上传成功,那自动加ubb代码呢…
在http://www.diygame.com/blog_upfile.asp 里加一句js脚本
<script>parent.frmannounce.content.value+=[img]http://www.diygame.com/+filename+[/img]</script>传上去再测试,错误提示"blog_upfile.asp 权限不够",既然diygame.com的文件权限不够,ylog.net总可以吧,当blog_upfile.asp操作完成时,再调用一个本服务器的asp文件,于是blog_upresult.asp出现了,他负责善后
修改blog_upfile.asp,我用c++的习惯,注释用//符
servername="www.ylog.net" //标志服务器名
//检查来源,是否为自己指定的服务器,
if not instr(1,request.servervariables("http_referer"),servername,1)=8 then
response.write "非法来源~!"
response.end
end if
//检查文件大小,类型,等,这些代码略去,网上很多关于fso组件的介绍
…
//上传代码,略去
….
//成功后转向的url,就是执行上传操作的地址,把信息当作msg传过去
url="http://"&servername&"/blog_upresult.asp?msg="
if 上传成功 then//把脚本传过去,因为js中的+号不能被传递.因此使用server.urlencode函数,此脚本在ylog.net上才有权限运行
url=url+ "<script>parent.frmannounce.content.value"&server.urlencode("+")&"=[img]http://www.diygame.com/"&filename&"[/img]</script>"
//把文件名也传送过去,以便存数据库备查
response.redirect url+"上传成功&filename="&filename
end if
下面就是blog_upresult.asp上的代码了,很简单
//传成功了,自然要把已经diable的提交blog按纽恢复
<script>
parent.frmannounce.submit.disabled=false;
</script>
//还有就是把传过来的信息显示出来
response.write request("msg")
//如果request("filename")<>"" 写入数据库代码省略
response.write "[ <a href=# onclick=history.go(-1)>重新上传</a> ]"
看上去perfect了,但如人家得到了你的源码的话,轻而易举把你的上传服务器当成网络硬盘用….
只要把hosts文件里的中一句 127.0.0.1 www.ylog.net
然后相应写一个提交文件用的blog_upload.asp就行了,
头疼ing,代码是不能允许有半点安全漏洞的,验证的域名能被欺骗,
那就验证上传者的用户名与密码,diygame.com怎么去ylog.net的数据库上去查询用户名与密码是否正确呢
这就少不了xmlhttp
先在ylog.net上做一个blog_upcheck.asp,内容非常简单,对传的用户名与密码验证,成功则输出1,失败则输出0
<%
name=request("name")
psw=request("psw")
checkstr(name)//滤掉sql字符
checkstr(psw))//滤掉sql字符
if 从数据库检查用户名=成功 then
response.write 0
else
response.write 1
end if
%>
blog_upfile.asp接受上传之前先调用此文件验证.下面为代码,虽然也是使用域名www.ylog.net但此操作在diygame.com的服务器上执行,所以与使用者本地的hosts文件无关
<%
str=gethttppage("http://"&servername&"/blog_upcheck.asp?name="&name&"&psw="&password)
if str<>"1" then
response.write "非法用户~!"
response.end
end if
//两个操作函数。非常有用,可以用到别的地方
function gethttppage(url)
set httpreq = server.createobject("microsoft.xmlhttp")
httpreq.open "get", url, false
httpreq.send
if httpreq.readystate <> 4 then exit function
gethttppage = bytes2bstr(httpreq.responsebody)
set httpreq = nothing
end function
function bytes2bstr(vin)
dim strreturn
dim i, thischarcode, nextcharcode
strreturn = ""
for i = 1 to lenb(vin)
thischarcode = ascb(midb(vin, i, 1))
if thischarcode < &h80 then
strreturn = strreturn & chr(thischarcode)
else
nextcharcode = ascb(midb(vin, i + 1, 1))
strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
i = i + 1
end if
next
bytes2bstr = strreturn
end function
%>
做到这个地方,终于可以松口气了,写的很乱,希望能勉强看懂。。。
如果你有更好的方法或者有什么看不懂的地方,欢迎来我的blog交流,网址在上面已经出现过很多遍