伺服器|解決|上傳
如果你有兩個空間,一個大而慢,另外一個小而快,或者其中一個不支援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=" 上 傳 " >
測試一下,檔案上傳成功,那自動加UBB代碼呢...
在http://www.diygame.com/blog_UPFILE.ASP 裡加一句js指令碼
<script>parent.frmAnnounce.Content.value+=''</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("+")&"=''</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交流,網址在上面已經出現過很多遍