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