明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

使用ASP改進(jìn)文檔上載控件 (轉(zhuǎn))

[摘要]利用ASP改進(jìn)文檔上載控件隨著互聯(lián)網(wǎng)的發(fā)展,人們發(fā)布和獲取信息的方式發(fā)生了根本的變化,越來(lái)越多的人開(kāi)始把網(wǎng)絡(luò)作為最重要的發(fā)布和獲取信息的途徑,同時(shí),能發(fā)布并令信息共享的技術(shù)也越來(lái)越多。雖然這些技術(shù)為開(kāi)發(fā)人員帶來(lái)了極大的便利,但是由于種種原因,其中有些技術(shù)還存在著這樣或那樣的缺陷。因此,開(kāi)發(fā)人員在選...

利用ASP改進(jìn)文檔上載控件



隨著互聯(lián)網(wǎng)的發(fā)展,人們發(fā)布和獲取信息的方式發(fā)生了根本的變化,越來(lái)越多的人開(kāi)始把網(wǎng)絡(luò)作為最重要的發(fā)布和獲取信息的途徑,同時(shí),能發(fā)布并令信息共享的技術(shù)也越來(lái)越多。雖然這些技術(shù)為開(kāi)發(fā)人員帶來(lái)了極大的便利,但是由于種種原因,其中有些技術(shù)還存在著這樣或那樣的缺陷。因此,開(kāi)發(fā)人員在選擇和使用各種技術(shù)時(shí),一定要認(rèn)清這些技術(shù)的優(yōu)點(diǎn)和局限性,取長(zhǎng)補(bǔ)短,才能設(shè)計(jì)出功能完善的程序。
提出問(wèn)題
筆者曾在建設(shè)企業(yè)內(nèi)部信息網(wǎng)工程中開(kāi)發(fā)過(guò)基于Web的文檔資源共享信息網(wǎng)站。該網(wǎng)站要求上載的文檔能自動(dòng)在主頁(yè)中根據(jù)文檔的類(lèi)別按文檔標(biāo)題連接到對(duì)應(yīng)的欄目里。針對(duì)這種需求,筆者利用IIS的文檔上載控件Posting Acceptor Components,結(jié)合數(shù)據(jù)庫(kù)和Web技術(shù),開(kāi)發(fā)出了一套自動(dòng)化程度很高的文檔自動(dòng)網(wǎng)頁(yè)發(fā)布系統(tǒng)和文檔自動(dòng)網(wǎng)頁(yè)生成系統(tǒng)。在開(kāi)發(fā)該系統(tǒng)的過(guò)程中,筆者發(fā)現(xiàn)IIS下的上載控件cpshost.dll在使用中存在一定的問(wèn)題。例如,為完成上載,筆者開(kāi)發(fā)了兩個(gè)程序:程序一(Upload.asp)提供基于Web的信息文檔上載錄入界面;程序二(wd_writer.asp)把程序一錄入的信息記錄到數(shù)據(jù)庫(kù)中。其中相關(guān)代碼如下:
程序一(upload.asp):
……
’提供文檔上載的客戶(hù)界面
<form enctype=“multipart/form-data” action=“http://<%= Request.ServerVariables
(“SERVER_NAME”)%>/scripts/cpshost.dll?PUBLISH?wd_writer.asp” method=“post”>
<p>文檔主題: <input type=“text” name=“subject”><br>
作者:<input name=“author” type=“text”><br>
發(fā)布時(shí)間: <input name=“date1” type=“text”><br>
上載文檔名(點(diǎn)擊瀏覽按鈕可進(jìn)行選擇):<input type=“file” name=“filename”>
Destination URL: <input type=“hidden” name=“TargetURL”
value=“http://<%= Request.ServerVariables(“SERVER_NAME”)%>/users/wdls ”>
<input type=“submit” value=“發(fā)布確定”> </p>
</form>
……
程序二(wd_writer.asp):
<%'打開(kāi)數(shù)據(jù)庫(kù)  
Set mydata = Server.CreateObject
(“ADODB.Connection”)
mydata.Open “DSN=xczh;UID=sa;PWD=;”
'從表單中取出各項(xiàng)內(nèi)容
date1=Request.form(“date1”) '取時(shí)間  
'取文檔主題
subject=Request.form(“subject”)  
'取作者
author=Request.form(“subject”)  
'取文檔文件名
filename=Request.form(“filename”)  
'取文檔在Web服務(wù)器中存放的物理地址
TargetURL=Request.form(“filename”)
'寫(xiě)數(shù)據(jù)庫(kù)
sqlstr=“insert into wdlsb values(” & sn & “,‘” & subject & “',‘” & date1 & “',‘”& filename & “',‘” & TargetURL & “',‘” & author & “')”  
Mydata.Execute(sqlstr)
%>
上述程序的語(yǔ)法結(jié)構(gòu)和邏輯結(jié)構(gòu)都正確無(wú)誤,但在使用時(shí)卻出現(xiàn)了問(wèn)題。當(dāng)在程序一中表單的subject 、Author、filename 域中填寫(xiě)漢字后,在程序二中用Request取出的表單域值為亂碼,即不能正確從表單中取出域值。此時(shí),表單進(jìn)行POST請(qǐng)求服務(wù)時(shí)的域值的封裝模式(enctype)為“multipart/form-data”,即RFC 1867。于是筆者把程序一進(jìn)行POST請(qǐng)求服務(wù)時(shí)的封裝模式修改為“text”,但卻出現(xiàn)了“無(wú)法上載文檔”的錯(cuò)誤。筆者分析后發(fā)現(xiàn),文檔上載控件cpshost.dll只能在表單的“multipart/form-data”封裝模式(既RFC 1867格式)下才能在瀏覽器與服務(wù)器之間進(jìn)行文檔上載。
解決問(wèn)題
筆者采用改變操作流程的方法,解決了上述問(wèn)題。首先,由用戶(hù)填寫(xiě)表單(程序三Upload.asp),并提交給程序四(wd_read.asp)進(jìn)行預(yù)處理。在程序四中利用session對(duì)象暫時(shí)保存subject、author、date1、filename、targetUrl等表單域的輸入值。向用戶(hù)輸出一個(gè)確認(rèn)頁(yè)面,由用戶(hù)再次確認(rèn)表單。然后,設(shè)置表單的封裝模式為“multipart/form-data”,并進(jìn)行上載操作。最后,由cpshost.dll調(diào)用程序五(wd_writer.asp)。由程序五取出存儲(chǔ)于內(nèi)建對(duì)象session中的域值,進(jìn)行數(shù)據(jù)庫(kù)操作和操作確認(rèn)。如果程序四出現(xiàn)不可預(yù)測(cè)的錯(cuò)誤,則文檔上載失敗,不會(huì)調(diào)用程序五,因此保持了數(shù)據(jù)庫(kù)的完整性。相關(guān)代碼如下:
程序三(upload.asp):
<form action=“http://<%= Request.
ServerVariables(“SERVER_NAME”)>/wd_read.asp” method=“post">
<p>文檔主題: <input type=“text” name=“subject”><br>
作者:<input name=“author” type=“text”><br>
發(fā)布時(shí)間: <input name=“date1” type=“text”><br>
上載文檔名(點(diǎn)擊瀏覽按鈕可進(jìn)行選擇):<input type=“file” name=“filename”>
Destination URL: <input type=“hidden” name=“TargetURL” value=“http://<%= Request
.ServerVariables(“SERVER_NAME”)%>/users/<%=Request.ServerVariables(“LOGON_USER”) %>” size=“20”><br>
<input type=“submit” value=“發(fā)布確定”> </p>
</form>
程序四(wd-read.asp):
<% '取出程序三中的表單域值并保存在session中
session(“subject”)=Request.form(“subject”)
session(“date1”)=Request.form(“date1”)
session(“author”)=Request.form(“author”)
session(“filename”)=Request.form(“filename”)
session(“TargetURL”)=Request.form(“TargetURL”)
%>
……
<form enctype=“multipart/form-data” action=
“http://<%= Request.ServerVariables
(“SERVER_NAME”) %>/scripts/cpshost.dll?PUBLISH?wd_writer.asp” method=“post”>
上載文件名(點(diǎn)擊瀏覽按鈕可進(jìn)行選擇):<input type=“file” name=“filename” value=“<%=session(“filename”)%>”>
<input type=“hidden” name=“TargetURL”
value=“http://<%= Request.ServerVariables(“SERVER_NAME”) %>/users/wdls” >
<input type=“submit” value=“發(fā)布確定”> </p>
</form>
程序五(wd_writer.asp):
<% '打開(kāi)數(shù)據(jù)庫(kù)  
Set mydata = Server.CreateObject
(“ADODB.Connection”)
mydata.Open “DSN=xczh;UID=sa;PWD=;”
’取各表單域的值
date1=session(“date1”) '取時(shí)間  
subject=session(“subject”) '取文檔主題
author=session(“subject”) '取作者
filename=session(“filename”) '取文檔名
'取文檔在Web服務(wù)器中存放的物理地址
TargetURL= session(“TargetURL”)  
'寫(xiě)數(shù)據(jù)庫(kù),保存文檔記錄
sqlstr=“insert into wdlsb values(” & sn & “,‘”& subject & “',‘” & date1 & “',‘”& filename & “',‘” & TargetURL &“',‘” & author & “')”  
Mydata.Execute(sqlstr)
%>
完善程序
上述程序雖然已經(jīng)能滿(mǎn)足設(shè)計(jì)時(shí)的要求,但還是有需要完善的地方。例如,由于在程序三中輸入的文件名在程序四中會(huì)預(yù)置給表單域filename,所以,一旦客戶(hù)端重新輸入新的文件名后提交確認(rèn),會(huì)使程序五中寫(xiě)入數(shù)據(jù)庫(kù)的文件名與實(shí)際上載的文件名不一致,造成網(wǎng)頁(yè)連接時(shí)出錯(cuò)。為避免出現(xiàn)此類(lèi)錯(cuò)誤,在進(jìn)行文檔上載時(shí),應(yīng)對(duì)表單域filename的值與程序三中的域值進(jìn)行比較,如果兩者相等,立即進(jìn)行文件上載,否則取消操作。相關(guān)代碼如下:
修改程序四(wd_read.asp):
<form enctype=“multipart/form-data” action=“http://<%= Request.ServerVariables
(“SERVER_NAME”) %>/scripts/cpshost.dll?PUBLISH?wd_writer.asp” method=“post” name=“form1”>
上載文檔名(點(diǎn)擊瀏覽按鈕可進(jìn)行選擇):<input type=“file” name=“filename” value=“<%=session(“filename”)%>”>
<input type=“hidden” name=“TargetURL” value=“http://<%= Request.ServerVariables
(“SERVER_NAME”) %>/users/wdls” >
’把表單中的按鈕改為‘button’模式,變成普通按鈕,當(dāng)點(diǎn)擊時(shí),執(zhí)行腳本程序upload_onclick
<input type=“button” name=“upload” value=“發(fā)布確定”>
</form>
’對(duì)表單域filename的值進(jìn)行判斷
<scripts language=“VBScript”>
<!--
sub upload_onclick()
set myform=window.document.form1
tmp=myform.filename.value
if strcomp(tmp,<%=session
(“filename”)%>)=0 then  
form1.submit  
else
msgbox “輸入的文件名有誤,請(qǐng)返回重新輸入。!”
end if  
end sub
-->
</scripts>
經(jīng)過(guò)上述改進(jìn)后,系統(tǒng)運(yùn)轉(zhuǎn)平穩(wěn)可靠,縮短了信息上網(wǎng)周期,大大地提高了文檔的上網(wǎng)效率。該系統(tǒng)完整的程序中還包括對(duì)用戶(hù)口令和權(quán)限的驗(yàn)證、文檔主題是否為空的驗(yàn)證、作者域驗(yàn)證、文檔的分類(lèi)選擇、上載文檔重名的驗(yàn)證、數(shù)據(jù)庫(kù)操作的異常處理等。