如果你有兩個空間,一個大而慢,另外一個小而快,或者其中一個不支持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交流,網址在上面已經出現過很多遍
|