ASP跨伺服器上傳檔案完美解決

來源:互聯網
上載者:User
伺服器|解決|上傳

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



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.