深入研究“用ASP上傳檔案”(二)

來源:互聯網
上載者:User
二、在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,可以限制上傳的規模或即時決定取消上傳。而最好的一點在於可以動態改變上傳的位置。


   ■ 處理過程: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有明顯優勢。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.