深入研究“用ASP上載文件”(二)
發表時間:2024-02-18 來源:明輝站整理相關軟件相關文章人氣:
[摘要]二、在ASP中執行 現在已經得出結論,RFC1867是在WEB應用程序上載文件的最好方式。那么如何來運行?Microsoft提供了什么方法?其它有哪些方法可以用? Microsoft的Posting Acceptor ASP不支持multipart/form-data編碼方式,但是,Micro...
二、在ASP中執行
現在已經得出結論,RFC1867是在WEB應用程序上載文件的最好方式。那么如何來運行?Microsoft提供了什么方法?其它有哪些方法可以用?
Microsoft的Posting Acceptor
ASP不支持multipart/form-data編碼方式,但是,Microsoft提供了免費的Posting Acceptor(http://www.microsoft.com/iis/support/iishelp/iis/htm/core/pareadme.htm),它是一個ISAPI應用程序,上載結束后,產生一個到ASP頁的重新投遞。(見 Scott Stanfield的文章 issue of MIND(98年七月))。
Software Artisans的SA-FileUp
SA-FileUp(http://www.softartisans.com/softartisans/saf.html)是最早的商業活動服務器組件(Active Server Components)之一。第一版是97年5月開始使用的,現在全世界包括Microsoft.com在內的上千個網站都在使用它。早期的Beta版本用ISAPI過濾器和活動服務器組件的聯合體與ASP結合起來。接著,Microsoft推出了ASP 1.0b(ASP.DLL 1.15.14.0),提供了一種新方法:Request.BinaryRead(二進制讀請求)。二進制讀方法使瀏覽器中的原始未加工數據可以被活動服務器組件使用。這樣一來,SA-FileUp就不再需要ISAPI過濾器,而作為一個ASP組件存在了。
SA-FileUp使用二進制讀請求,而不是通過表單對象。這樣是有意義的:你怎能一邊從瀏覽器讀原始數據流,又同時把它作為表信息來解析呢?為了照顧ASP開發人員,SA-FileUp 在它自己的表集里重新提供了所有的表請求 功能。這樣使習慣于使用表請求的ASP編程人員對SA-FileUp 能夠更加熟悉。
Posting Acceptor與SA-FileUp 之比較
現在就PA和SA-FileUp進行一個盡可能客觀的比較:
■ 與ASP的結合性:SA-FileUp在ASP中是完全可腳本化的,它可以與ASP應用程序很好地結合起來, 而不是作為一個獨立的ISAPI DLL存在。
■ 標準支持性:從IE瀏覽器進行PA上載要使用其特有的WebPost API,所以不如RFC1867, 使用PA,對于Netscape和IE用戶要使用不同的格式。
■ 匿名連接:由于PA使用一個ISAPI DLL,在ASP應用程序以外它就必須提供額外的安全保護。因此在默認狀態下PA不允許一切匿名連接。PA 1.1可以允許匿名上載,但是因為有一個上載的編程控制,這里仍然有一定的危險。由于SA-FileUp已經和ASP結合在一起,應用程序可以決定適當的安全度,包括匿名。
■ 上載控制:上載正在發送時,PA不允許任何控制。但是用SA-FileUp,可以限制上載的規;驅崟r決定取消上載。而最好的一點在于可以動態改變上載的位置。
■ 處理過程:PA有兩步:上載和重新投遞。用SA-FileUp,一切都可以一步完成,例如根據上載的狀態寫數據庫。
■ 上載到一個數據庫:PA只能上載到文件,SA-FileUp可上載到文件和數據庫。
■ “文件名中的空格”:當處理含有空格的文件名時,PA存在問題;SA-FileUp就沒有這樣的漏洞。
■ 價格:PA可從Microsoft免費下載,與NT選項軟擇包捆綁在一起。而SA-FileUp不是免費的:它是有支持的商業組件。
Vertigo Software的總裁Scott Stanfield(http://www.vertigosoftware.com/), 是MIND雜志98年7月號上Post Accetpor文章的作者,MIND上的文章發表之后,在 Software Artisans 上關于SA-FileUp,他又寫道:“知道了[SA-FileUp]非常興奮,這真是奇妙而有價值的產品。”
共同的支持問題
到現在為止,有關文件上載的支持問題主要是與安全有關的。通常網站都過分小心地保護NTFS 許可,它可以防止匿名用戶帳號向文件目的地址中進行寫入。而且即使是 高級服務器管理員也經常錯誤理解安全的含義。
要記住,IIS/ASP在一個特別的安全環境下運行每個ASP頁。如果沒有鑒別機制(沒有Basic,沒有NT Challenge/Response),每一頁都作為匿名用戶執行。網絡管理員可以設置與匿名用戶相應的NT帳號。
對于IIS3,默認的匿名用戶是IUSR_< computername >。
對于IIS4,所有運行中的網絡應用程序的默認匿名用戶都是IUSR_< computername >(“在單獨的內存空間運行”不被查看)。所有運行以外的應用程序的默認匿名用戶是 IWAM_< computername > (“在單獨的內存空間運行”被查看)。
使用SA-FileUp時,必須保證適當的用戶對目的路徑有讀、寫、刪除許可。
如果鑒別功能發揮作用,在運行ASP頁的過程中IIS/ASP 就將扮演已經鑒別的用戶。 因此經鑒別用戶的注冊帳號對目的路徑必須有讀、寫、刪除許可。
對IIS安全的深入討論已經超過了本文的范圍,the IIS 4 Resource Kit有很好的解釋。
一些代碼
理論已經足夠了,下面來看一些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文件一樣運行。
< 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 >
限制上載規模
要限制上載規模,只需要設置一個屬性:
< %@ 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個字節后的內容都將被刪除,WEB服務器的磁盤就不會不必要地被占滿。
結論
在WEB應用程序中實現上載文件非常簡單:區區兩行ASP代碼就能完成。HTTP/RFC1867文件上載因服務器提供的豐富的編程環境成為首選。SA-FileUp作為與ASP結合的活動服務器組件,比Microsoft的Posting Accetpro有明顯優勢。
(出處:熱點網絡)