跨服务器上传文件完美解决

  如果你有两个空间,一个大而慢,另外一个小而快,或者其中一个不支持FSO,那么跨服务器上传文件这个问题就摆在你面前了.
  前提条件,空间都必须支持ASP,上传文件的服务器支持FSO,下面的叙述中,a为存上传文件的服务器,b为网站服务器,即显示用户界面的服务器...
  实现功能,文件上传,上传后在网页的文本区域自动加上对于图片的UBB码,为了清楚,下面列出所有用到的文件。

服务器             文件名                   用途
a        blog_upfile.asp             接收上传文件用
b        blog_add.asp               添加BLOG,上传文件功能在此出现
b        blog_upload.html          上传文件表单,以iframe的形式嵌在blog_add.asp里
b        blog_upresult.asp        显示上传结果,作善后工作
b        blog_upcheck.asp         验证用户名与密码


  在发布BLOG页面Blog_add.asp增加一个iFrame,调用blog_upload.html进行上传操作

<iframe border="0" frameBorder="0" frameSpacing="0" height="25" marginHeight="0" marginWidth="0" noResize scrolling="no" width="100%" vspale="0" src="blog_upload.html"></iframe>

  如果你玩过ASP,自然不费吹灰之力想到,文件要传到另外一个服务器上,只要把blog_upload.html里的上传Form的action页面指向目标服务器就行了,

<form name="form" method="post" action="a/blog_UPFILE.ASP"
//中间略去
//提交时把发布BLOG的按纽disable先,以免没传完就时用户把BLOG发表了
  <input type="submit" class=button name="Submit" value=" 上 传 " onclick="parent.document.frmAnnounce.Submit.disabled=true">

  测试一下,文件上传成功,那自动加UBB代码呢...
在a/blog_UPFILE.ASP  里加一句js脚本

<script>parent.frmAnnounce.Content.value+=''</script>
  传上去再测试,错误提示"blog_UPFILE.ASP  权限不够",既然a的文件权限不够,b总可以吧,当blog_upfile.asp操作完成时,再调用一个本服务器的ASP文件,于是blog_upresult.asp出现了,他负责善后
修改blog_upfile.asp,我用C++的习惯,注释用//符


servername="b"  //标志服务器名
//检查来源,是否为自己指定的服务器,
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函数,此脚本在b上才有权限运行
    url=url+ "<script>parent.frmAnnounce.Content.value"&server.urlencode;("+")&"=''</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  b
然后相应写一个提交文件用的blog_upload.html就行了,
头疼ing,代码是不能允许有半点安全漏洞的,验证的域名能被欺骗,
那就验证上传者的用户名与密码,a怎么去b的数据库上去查询用户名与密码是否正确呢
这就少不了xmlhttp
先在b上做一个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接受上传之前先调用此文件验证.下面为代码,虽然也是使用域名b但此操作在a的服务器上执行,所以与使用者本地的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
%>


文章来自: 本站原创
引用通告地址: http://www.cxblog.net/trackback.asp?tbID=318
Tags: 服务器 上传
相关日志:

评论: 0 | 引用: 0 | 查看次数: 409
发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码:
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 关闭 | [img]标签 关闭