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

深入研究“用ASP上載文件”(二)

[摘要]二、在ASP中執(zhí)行 現(xiàn)在已經(jīng)得出結(jié)論,RFC1867是在WEB應(yīng)用程序上載文件的最好方式。那么如何來運(yùn)行?Microsoft提供了什么方法?其它有哪些方法可以用? Microsoft的Posting Acceptor ASP不支持multipart/form-data編碼方式,但是,Micro...

二、在ASP中執(zhí)行
現(xiàn)在已經(jīng)得出結(jié)論,RFC1867是在WEB應(yīng)用程序上載文件的最好方式。那么如何來運(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),它是一個ISAPI應(yīng)用程序,上載結(jié)束后,產(chǎn)生一個到ASP頁的重新投遞。(見 Scott Stanfield的文章 issue of MIND(98年七月))。

Software Artisans的SA-FileUp

SA-FileUp(http://www.softartisans.com/softartisans/saf.html)是最早的商業(yè)活動服務(wù)器組件(Active Server Components)之一。第一版是97年5月開始使用的,現(xiàn)在全世界包括Microsoft.com在內(nèi)的上千個網(wǎng)站都在使用它。早期的Beta版本用ISAPI過濾器和活動服務(wù)器組件的聯(lián)合體與ASP結(jié)合起來。接著,Microsoft推出了ASP 1.0b(ASP.DLL 1.15.14.0),提供了一種新方法:Request.BinaryRead(二進(jìn)制讀請求)。二進(jìn)制讀方法使瀏覽器中的原始未加工數(shù)據(jù)可以被活動服務(wù)器組件使用。這樣一來,SA-FileUp就不再需要ISAPI過濾器,而作為一個ASP組件存在了。

SA-FileUp使用二進(jìn)制讀請求,而不是通過表單對象。這樣是有意義的:你怎能一邊從瀏覽器讀原始數(shù)據(jù)流,又同時把它作為表信息來解析呢?為了照顧ASP開發(fā)人員,SA-FileUp 在它自己的表集里重新提供了所有的表請求 功能。這樣使習(xí)慣于使用表請求的ASP編程人員對SA-FileUp 能夠更加熟悉。

Posting Acceptor與SA-FileUp 之比較

現(xiàn)在就PA和SA-FileUp進(jìn)行一個盡可能客觀的比較:

■ 與ASP的結(jié)合性:SA-FileUp在ASP中是完全可腳本化的,它可以與ASP應(yīng)用程序很好地結(jié)合起來, 而不是作為一個獨(dú)立的ISAPI DLL存在。

■ 標(biāo)準(zhǔn)支持性:從IE瀏覽器進(jìn)行PA上載要使用其特有的WebPost API,所以不如RFC1867, 使用PA,對于Netscape和IE用戶要使用不同的格式。


■ 匿名連接:由于PA使用一個ISAPI DLL,在ASP應(yīng)用程序以外它就必須提供額外的安全保護(hù)。因此在默認(rèn)狀態(tài)下PA不允許一切匿名連接。PA 1.1可以允許匿名上載,但是因?yàn)橛幸粋上載的編程控制,這里仍然有一定的危險(xiǎn)。由于SA-FileUp已經(jīng)和ASP結(jié)合在一起,應(yīng)用程序可以決定適當(dāng)?shù)陌踩,包括匿名?


■ 上載控制:上載正在發(fā)送時,PA不允許任何控制。但是用SA-FileUp,可以限制上載的規(guī);?qū)崟r決定取消上載。而最好的一點(diǎn)在于可以動態(tài)改變上載的位置。


■ 處理過程:PA有兩步:上載和重新投遞。用SA-FileUp,一切都可以一步完成,例如根據(jù)上載的狀態(tài)寫數(shù)據(jù)庫。


■ 上載到一個數(shù)據(jù)庫:PA只能上載到文件,SA-FileUp可上載到文件和數(shù)據(jù)庫。

■ “文件名中的空格”:當(dāng)處理含有空格的文件名時,PA存在問題;SA-FileUp就沒有這樣的漏洞。


■ 價格:PA可從Microsoft免費(fèi)下載,與NT選項(xiàng)軟擇包捆綁在一起。而SA-FileUp不是免費(fèi)的:它是有支持的商業(yè)組件。

Vertigo Software的總裁Scott Stanfield(http://www.vertigosoftware.com/), 是MIND雜志98年7月號上Post Accetpor文章的作者,MIND上的文章發(fā)表之后,在 Software Artisans 上關(guān)于SA-FileUp,他又寫道:“知道了[SA-FileUp]非常興奮,這真是奇妙而有價值的產(chǎn)品!

共同的支持問題

到現(xiàn)在為止,有關(guān)文件上載的支持問題主要是與安全有關(guān)的。通常網(wǎng)站都過分小心地保護(hù)NTFS 許可,它可以防止匿名用戶帳號向文件目的地址中進(jìn)行寫入。而且即使是 高級服務(wù)器管理員也經(jīng)常錯誤理解安全的含義。

要記住,IIS/ASP在一個特別的安全環(huán)境下運(yùn)行每個ASP頁。如果沒有鑒別機(jī)制(沒有Basic,沒有NT Challenge/Response),每一頁都作為匿名用戶執(zhí)行。網(wǎng)絡(luò)管理員可以設(shè)置與匿名用戶相應(yīng)的NT帳號。

對于IIS3,默認(rèn)的匿名用戶是IUSR_< computername >。

對于IIS4,所有運(yùn)行中的網(wǎng)絡(luò)應(yīng)用程序的默認(rèn)匿名用戶都是IUSR_< computername >(“在單獨(dú)的內(nèi)存空間運(yùn)行”不被查看)。所有運(yùn)行以外的應(yīng)用程序的默認(rèn)匿名用戶是 IWAM_< computername > (“在單獨(dú)的內(nèi)存空間運(yùn)行”被查看)。

使用SA-FileUp時,必須保證適當(dāng)?shù)挠脩魧δ康穆窂接凶x、寫、刪除許可。

如果鑒別功能發(fā)揮作用,在運(yùn)行ASP頁的過程中IIS/ASP 就將扮演已經(jīng)鑒別的用戶。 因此經(jīng)鑒別用戶的注冊帳號對目的路徑必須有讀、寫、刪除許可。

對IIS安全的深入討論已經(jīng)超過了本文的范圍,the IIS 4 Resource Kit有很好的解釋。

一些代碼

理論已經(jīng)足夠了,下面來看一些ASP代碼。

單個文件上載

下面是單個文件上載的一個簡單的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 >

有附加表單元素的文件上載

增加附加表單元素非常簡單。只要正確指定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= 屬性,對多文件的情況就必須在每個文件中都使用一個額外的< INPUT >語句。


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è)置一個屬性:


< %@ 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個字節(jié)后的內(nèi)容都將被刪除,WEB服務(wù)器的磁盤就不會不必要地被占滿。

結(jié)論

在WEB應(yīng)用程序中實(shí)現(xiàn)上載文件非常簡單:區(qū)區(qū)兩行ASP代碼就能完成。HTTP/RFC1867文件上載因服務(wù)器提供的豐富的編程環(huán)境成為首選。SA-FileUp作為與ASP結(jié)合的活動服務(wù)器組件,比Microsoft的Posting Accetpro有明顯優(yōu)勢。
(出處:熱點(diǎn)網(wǎng)絡(luò))