深入研究“用ASP上載文件”(二)
發(fā)表時(shí)間:2024-06-15 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]二、在A(yíng)SP中執(zhí)行 現(xiàn)在已經(jīng)得出結(jié)論,RFC1867是在WEB應(yīng)用程序上載文件的最好方式。那么如何來(lái)運(yùn)行?Microsoft提供了什么方法?其它有哪些方法可以用? Microsoft的Posting Acceptor ASP不支持multipart/form-data編碼方式,但是,Micro...
二、在A(yíng)SP中執(zhí)行
現(xiàn)在已經(jīng)得出結(jié)論,RFC1867是在WEB應(yīng)用程序上載文件的最好方式。那么如何來(lái)運(yùn)行?Microsoft提供了什么方法?其它有哪些方法可以用?
Microsoft的Posting Acceptor
ASP不支持multipart/form-data編碼方式,但是,Microsoft提供了免費(fèi)的Posting Acceptor(http://www.microsoft.com/iis/support/iishelp/iis/htm/core/pareadme.htm),它是一個(gè)ISAPI應(yīng)用程序,上載結(jié)束后,產(chǎn)生一個(gè)到ASP頁(yè)的重新投遞。(見(jiàn) Scott Stanfield的文章 issue of MIND(98年七月))。
Software Artisans的SA-FileUp
SA-FileUp(http://www.softartisans.com/softartisans/saf.html)是最早的商業(yè)活動(dòng)服務(wù)器組件(Active Server Components)之一。第一版是97年5月開(kāi)始使用的,現(xiàn)在全世界包括Microsoft.com在內(nèi)的上千個(gè)網(wǎng)站都在使用它。早期的Beta版本用ISAPI過(guò)濾器和活動(dòng)服務(wù)器組件的聯(lián)合體與ASP結(jié)合起來(lái)。接著,Microsoft推出了ASP 1.0b(ASP.DLL 1.15.14.0),提供了一種新方法:Request.BinaryRead(二進(jìn)制讀請(qǐng)求)。二進(jìn)制讀方法使瀏覽器中的原始未加工數(shù)據(jù)可以被活動(dòng)服務(wù)器組件使用。這樣一來(lái),SA-FileUp就不再需要ISAPI過(guò)濾器,而作為一個(gè)ASP組件存在了。
SA-FileUp使用二進(jìn)制讀請(qǐng)求,而不是通過(guò)表單對(duì)象。這樣是有意義的:你怎能一邊從瀏覽器讀原始數(shù)據(jù)流,又同時(shí)把它作為表信息來(lái)解析呢?為了照顧ASP開(kāi)發(fā)人員,SA-FileUp 在它自己的表集里重新提供了所有的表請(qǐng)求 功能。這樣使習(xí)慣于使用表請(qǐng)求的ASP編程人員對(duì)SA-FileUp 能夠更加熟悉。
Posting Acceptor與SA-FileUp 之比較
現(xiàn)在就PA和SA-FileUp進(jìn)行一個(gè)盡可能客觀(guān)的比較:
■ 與ASP的結(jié)合性:SA-FileUp在A(yíng)SP中是完全可腳本化的,它可以與ASP應(yīng)用程序很好地結(jié)合起來(lái), 而不是作為一個(gè)獨(dú)立的ISAPI DLL存在。
■ 標(biāo)準(zhǔn)支持性:從IE瀏覽器進(jìn)行PA上載要使用其特有的WebPost API,所以不如RFC1867, 使用PA,對(duì)于Netscape和IE用戶(hù)要使用不同的格式。
■ 匿名連接:由于PA使用一個(gè)ISAPI DLL,在A(yíng)SP應(yīng)用程序以外它就必須提供額外的安全保護(hù)。因此在默認(rèn)狀態(tài)下PA不允許一切匿名連接。PA 1.1可以允許匿名上載,但是因?yàn)橛幸粋(gè)上載的編程控制,這里仍然有一定的危險(xiǎn)。由于SA-FileUp已經(jīng)和ASP結(jié)合在一起,應(yīng)用程序可以決定適當(dāng)?shù)陌踩,包括匿名?
■ 上載控制:上載正在發(fā)送時(shí),PA不允許任何控制。但是用SA-FileUp,可以限制上載的規(guī)模或?qū)崟r(shí)決定取消上載。而最好的一點(diǎn)在于可以動(dòng)態(tài)改變上載的位置。
■ 處理過(guò)程:PA有兩步:上載和重新投遞。用SA-FileUp,一切都可以一步完成,例如根據(jù)上載的狀態(tài)寫(xiě)數(shù)據(jù)庫(kù)。
■ 上載到一個(gè)數(shù)據(jù)庫(kù):PA只能上載到文件,SA-FileUp可上載到文件和數(shù)據(jù)庫(kù)。
■ “文件名中的空格”:當(dāng)處理含有空格的文件名時(shí),PA存在問(wèn)題;SA-FileUp就沒(méi)有這樣的漏洞。
■ 價(jià)格:PA可從Microsoft免費(fèi)下載,與NT選項(xiàng)軟擇包捆綁在一起。而SA-FileUp不是免費(fèi)的:它是有支持的商業(yè)組件。
Vertigo Software的總裁Scott Stanfield(http://www.vertigosoftware.com/), 是MIND雜志98年7月號(hào)上Post Accetpor文章的作者,MIND上的文章發(fā)表之后,在 Software Artisans 上關(guān)于SA-FileUp,他又寫(xiě)道:“知道了[SA-FileUp]非常興奮,這真是奇妙而有價(jià)值的產(chǎn)品!
共同的支持問(wèn)題
到現(xiàn)在為止,有關(guān)文件上載的支持問(wèn)題主要是與安全有關(guān)的。通常網(wǎng)站都過(guò)分小心地保護(hù)NTFS 許可,它可以防止匿名用戶(hù)帳號(hào)向文件目的地址中進(jìn)行寫(xiě)入。而且即使是 高級(jí)服務(wù)器管理員也經(jīng)常錯(cuò)誤理解安全的含義。
要記住,IIS/ASP在一個(gè)特別的安全環(huán)境下運(yùn)行每個(gè)ASP頁(yè)。如果沒(méi)有鑒別機(jī)制(沒(méi)有Basic,沒(méi)有NT Challenge/Response),每一頁(yè)都作為匿名用戶(hù)執(zhí)行。網(wǎng)絡(luò)管理員可以設(shè)置與匿名用戶(hù)相應(yīng)的NT帳號(hào)。
對(duì)于IIS3,默認(rèn)的匿名用戶(hù)是IUSR_< computername >。
對(duì)于IIS4,所有運(yùn)行中的網(wǎng)絡(luò)應(yīng)用程序的默認(rèn)匿名用戶(hù)都是IUSR_< computername >(“在單獨(dú)的內(nèi)存空間運(yùn)行”不被查看)。所有運(yùn)行以外的應(yīng)用程序的默認(rèn)匿名用戶(hù)是 IWAM_< computername > (“在單獨(dú)的內(nèi)存空間運(yùn)行”被查看)。
使用SA-FileUp時(shí),必須保證適當(dāng)?shù)挠脩?hù)對(duì)目的路徑有讀、寫(xiě)、刪除許可。
如果鑒別功能發(fā)揮作用,在運(yùn)行ASP頁(yè)的過(guò)程中IIS/ASP 就將扮演已經(jīng)鑒別的用戶(hù)。 因此經(jīng)鑒別用戶(hù)的注冊(cè)帳號(hào)對(duì)目的路徑必須有讀、寫(xiě)、刪除許可。
對(duì)IIS安全的深入討論已經(jīng)超過(guò)了本文的范圍,the IIS 4 Resource Kit有很好的解釋。
一些代碼
理論已經(jīng)足夠了,下面來(lái)看一些ASP代碼。
單個(gè)文件上載
下面是單個(gè)文件上載的一個(gè)簡(jiǎn)單的HTML格式。
< HTML > < HEAD > < TITLE >Please Upload Your File< /TITLE >
< /HEAD > < BODY > < form enctype="multipart/form-data" method="post" action="formresp.asp" >
Enter filename to upload: < input type="file" name="f1" > < input type="submit" > < /form > < /BODY > < /HTML >
下面是文件'formresp.asp':
< %@ LANGUAGE="VBSCRIPT" % >
< HTML >< HEAD > < TITLE >Upload File Results< /TITLE > < /HEAD >
< BODY > Thank you for uploading your file.
< % Set upl = Server.CreateObject("SoftArtisans.FileUp") % >
< % upl.SaveAs "C: empupload.out" % >
Total Bytes Written: < %=upl.TotalBytes% >
< /BODY > < /HTML >
有附加表單元素的文件上載
增加附加表單元素非常簡(jiǎn)單。只要正確指定ENCTYPE,它就象任何普通HTML文件一樣運(yùn)行。
< HTML > < HEAD > < TITLE >Please Upload Your File< /TITLE >
< /HEAD > < BODY >
< form enctype="multipart/form-data" method="post" action="mformresp.asp" >
Enter description: < input type="text" name="descrip" > Enter filename to upload: < input type="file" name="f1" > < input type="submit" > < /form >
< /BODY > < /HTML >
下面是文件'mformresp.asp':
< %@ LANGUAGE="VBSCRIPT" % > < HTML >< HEAD > < TITLE >Upload
File Results< /TITLE > < /HEAD >
< BODY >
Thank you for uploading your file. < % Set upl = Server.CreateObject("SoftArtisans.FileUp") % >
< % upl.SaveAs "C: empupload.out" % > Your description is: '< %=upl.Form("descrip")% >' Total Bytes Written: < %=upl.TotalBytes% >
< /BODY > < /HTML >
多文件上載
由于瀏覽器不支持SIZE= 屬性,對(duì)多文件的情況就必須在每個(gè)文件中都使用一個(gè)額外的< INPUT >語(yǔ)句。
Enter first filename: < input type="file" name="f1" > Enter second filename: < input type="file" name="f2" >
格式處理是一樣的:
< %@ LANGUAGE="VBSCRIPT" % > < HTML >< HEAD >
< TITLE >Multiple File Upload Results< /TITLE > < /HEAD >
< BODY >
Thank you for uploading your files. < % Set upl = Server.CreateObject("SoftArtisans.FileUp") % > < % upl.Form("f1").SaveAs "C: empupload1.out" % > Total Bytes Written for file 1: < %=upl.Form("f1").TotalBytes% > < % upl.Form("f2").SaveAs "C: empupload2.out" % > Total Bytes Written for file 2: < %=upl.Form("f2").TotalBytes% > < /BODY > < /HTML >
限制上載規(guī)模
要限制上載規(guī)模,只需要設(shè)置一個(gè)屬性:
< %@ LANGUAGE="VBSCRIPT" % > < HTML >< HEAD > < TITLE >Upload File Results< /TITLE > < /HEAD > < BODY > Thank you for uploading your file. < % Set upl = Server.CreateObject("SoftArtisans.FileUp") % > < % upl.MaxBytes = 1000 '--- limit the upload size to 1000 bytes % > The maximum size that you are permitted to upload is < %=upl.MaxBytes% > bytes per file. < % upl.SaveAs "C: empupload.out" % > Total Bytes Written: < %=upl.TotalBytes% > Server Filename: < %=upl.ServerName% > Total Bytes Transmitted by you: < %=Request.TotalBytes% > < /BODY > < /HTML >
第1000個(gè)字節(jié)后的內(nèi)容都將被刪除,WEB服務(wù)器的磁盤(pán)就不會(huì)不必要地被占滿(mǎn)。
結(jié)論
在WEB應(yīng)用程序中實(shí)現(xiàn)上載文件非常簡(jiǎn)單:區(qū)區(qū)兩行ASP代碼就能完成。HTTP/RFC1867文件上載因服務(wù)器提供的豐富的編程環(huán)境成為首選。SA-FileUp作為與ASP結(jié)合的活動(dòng)服務(wù)器組件,比Microsoft的Posting Accetpro有明顯優(yōu)勢(shì)。
(出處:熱點(diǎn)網(wǎng)絡(luò))