国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ASP.NET - FileUpload Web 服務器控件概述(上)

2019-11-17 04:01:53
字體:
來源:轉載
供稿:網友
     使用 FileUpload 控件,可以為用戶提供一種將文件從其計算機發送到服務器的方法。

一、功能

可使用 FileUpload 控件執行下列操作:

·使用戶能夠上載存儲在服務器上的特定位置的文件。

·限制可上載的文件的大小。

·在存儲上載的文件之前檢查其屬性。



二、背景

FileUpload 控件使用戶能夠上載圖片、文本文件或其他文件。FileUpload 控件顯示一個文本框,在此用戶可以鍵入希望上載到服務器的文件的名稱。該控件還顯示一個“瀏覽”按鈕,該按鈕顯示一個文件導航對話框。(顯示的對話框取決于用戶計算機的操作系統。) 出于安全方面的考慮,不能將文件名預加載到 FileUpload 控件中。



      1、處理上載的文件

當用戶已選定要上載的文件并提交頁時,該文件將作為請求的一部分上載。文件將被完整地緩存在服務器內存中。文件完成上載后,頁代碼開始運行。

可以通過下面的方式訪問上載的文件:

·作為在 FileUpload 控件的 FileBytes 屬性中公開的字節數組。

·作為在 FileContent 屬性中公開的流。

·作為 PostedFile 屬性中類型 HttpPostedFile 的對象。PostedFile 對象公開一些屬性,如 ContentType 和 ContentLength 屬性,這些屬性為您提供有關上載的文件的信息。

在代碼運行時,可以檢查文件的特征,例如文件的名稱、大小和 MIME 類型,然后可以保存該文件。可以將文件當作字節數組或流來使用。另外,FileUpload 控件和 HttpPostedFile 對象都支持將文件寫入磁盤的 SaveAs 方法。

對所上載文件的保存位置,沒有固有限制。但是,若要保存文件,asp.net 進程必須具有在指定位置創建文件的權限。此外,還可能將應用程序配置為要求使用絕對路徑(而不是相對路徑)來保存文件,這是一種安全措施。如果將 httPRuntime 配置元素的 requireRootedSaveAsPath 屬性設置為 true(默認值),則在保存上載的文件時必須提供絕對路徑。

說明: 可以創建基于應用程序根文件夾的絕對路徑,方法是使用 HttpServerUtility 類的 MapPath 方法,并將表示應用程序根文件夾的顎化符 (~) 傳遞給該方法。

可上載的最大文件的大小取決于 MaxRequestLength 配置設置的值。如果用戶試圖上載大于最大允許值的文件,則上載會失敗。



      2、在部分頁更新中使用 FileUpload 控件

FileUpload 控件設計為僅用于回發方案,而不適用于部分頁呈現期間的異步回發方案。當您在 UpdatePanel 控件內部使用 FileUpload 控件時,必須使用作為面板的一個 PostBackTrigger 對象的控件來上載文件。UpdatePanel 控件用于更新頁的選定區域,而不是使用回發來更新整個頁面。



3、安全性和 FileUpload 控件

通過使用 FileUpload 控件,用戶可以上載可能存在惡意的文件,其中包含腳本文件和可執行文件。無法預先限制用戶可以上載的文件。如果希望限制用戶可以上載的文件的類型,則必須在上載文件后檢查文件特征,如文件的文件擴展名和文件的 ContentType 屬性的值。

      說明: 在提交頁面之前,可以使用客戶端腳本來檢查用戶在文本框中鍵入的文件名。盡管在客戶端執行文件名檢查會很有用,但這并不能保證用戶無法上載不安全的文件類型,如可執行文件。



三、如何:使用 FileUpload Web 服務器控件上載文件

      用 FileUpload Web 服務器控件,您可以向用戶提供一種將文件從其計算機發送到服務器的方法。要上載的文件將在回發期間作為瀏覽器請求的一部分提交給服務器。在文件完成上載后,您可以用代碼管理該文件。

      說明: 可上載的最大文件大小取決于 MaxRequestLength 配置設置的值。如果用戶試圖上載超過最大文件大小的文件,上載就會失敗。

      

1、向頁面添加 FileUpload 控件。

說明: 出于安全方面的考慮,不能將文件名預加載到 FileUpload 控件中。



      2、在事件(如該頁的 Load 事件)的處理程序中,執行下面的操作:

           ·通過測試 FileUpload 控件的 HasFile 屬性,檢查該控件是否有上載的文件。

·檢查該文件的文件名或 MIME 類型以確保用戶已上載了您要接收的文件。若要檢查 MIME 類型,請獲取作為 FileUpload 控件的 PostedFile 屬性公開的 HttpPostedFile 對象。然后,通過查看已發送文件的 ContentType 屬性,就可以獲取該文件的 MIME 類型。

安全說明: 在某些情況下,已上載文件的 MIME 類型可能是偽造的,因此只檢查文件的 MIME 類型不是一種可靠的安全檢查。

·將該文件保存到您指定的位置。您可以調用 HttpPostedFile 對象的 SaveAs 方法。或者,還可以使用 HttpPostedFile 對象的 InputStream 屬性,以字節數組或字節流的形式管理已上載的文件。

下面的示例演示如何使用已上載的文件。該代碼根據允許的文件擴展名的硬編碼列表檢查已上載文件的文件擴展名,并拒絕所有其他類型的文件。然后,將該文件寫入當前網站的 UploadedImages 文件夾中。用已上載文件在客戶端計算機上的文件名保存該文件。由于 HttpPostedFile 對象的 FileName 屬性返回該文件在客戶端計算機上的完整路徑,因此會使用 FileUpload 控件的 FileName 屬性。

安全說明: 請不要向用戶顯示所保存文件的路徑和文件名;這樣做可能會將有用的信息泄露給惡意用戶。

protected void Page_Load(object sender, EventArgs e)

{

    if(IsPostBack)

    {

        Boolean fileOK = false;

        String path = Server.MapPath("~/UploadedImages/");

        if (FileUpload1.HasFile)

        {

            String fileExtension =

                System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();

            String[] allowedExtensions =

                {".gif", ".png", ".jpeg", ".jpg"};

          for (int i = 0; i < allowedExtensions.Length; i++)

          {

               if (fileExtension == allowedExtensions[i])

               {

                    fileOK = true;

               }

          }

        }



        if (fileOK)

        {

            try

            {

                FileUpload1.PostedFile.SaveAs(path

                    + FileUpload1.FileName);

                Label1.Text = "File uploaded!";

            }

            catch (Exception ex)

            {

                Label1.Text = "File could not be uploaded.";

            }

        }

        else

        {

            Label1.Text = "Cannot accept files of this type.";

        }

    }

}



四、FileUpload 類

      FileUpload 類顯示一個文本框控件和一個瀏覽按鈕,使用戶可以選擇客戶端上的文件并將它上載到 Web 服務器。用戶通過在控件的文本框中輸入本地計算機上文件的完整路徑(例如,C:/MyFiles/TestFile.txt)來指定要上載的文件。用戶也可以通過單擊“瀏覽”按鈕,然后在“選擇文件”對話框中定位文件來選擇文件。

      說明: FileUpload 控件設計為僅用于部分頁面呈現期間的回發情況,并不用于異步回發情況。在 UpdatePanel 控件內部使用 FileUpload 控件時,必須通過一個控件來上載文件,該控件是面板的一個 PostBackTrigger 對象。UpdatePanel 控件用于更新頁面的選定區域而不是使用回發更新整個頁面。



      用戶選擇要上載的文件后,FileUpload 控件不會自動將該文件保存到服務器。您必須顯式提供一個控件或機制,使用戶能提交指定的文件。例如,可以提供一個按鈕,用戶單擊它即可上載文件。為保存指定文件所寫的代碼應調用 SaveAs 方法,該方法將文件內容保存到服務器上的指定路徑。通常,在引發回發到服務器的事件的事件處理方法中調用 SaveAs 方法。例如,如果提供一個用于提交文件的按鈕,則可以放入一段代碼,用于將該文件保存在單擊事件的事件處理方法中。

在調用 SaveAs 方法將文件保存到服務器之前,使用 HasFile 屬性來驗證 FileUpload 控件確實包含文件。若 HasFile 返回 true,則調用 SaveAs 方法。如果它返回 false,則向用戶顯示消息,指示控件不包含文件。不要通過檢查 PostedFile 屬性來確定要上載的文件是否存在,因為默認情況下該屬性包含 0 字節。因此,即使 FileUpload 控件為空,PostedFile 屬性仍返回一個非空值。

調用 SaveAs 方法時,必須指定用來保存上載文件的目錄的完整路徑。如果您沒有在應用程序代碼中顯式指定路徑,則當用戶試圖上載文件時將引發異常。該行為可防止用戶在應用程序目錄結構的任意位置進行寫操作以及防止用戶訪問敏感的根目錄,有助于確保服務器上文件的安全。

      SaveAs 方法將上載的文件寫到指定的目錄。因此,ASP.NET 應用程序必須具有服務器上該目錄的寫訪問權限。應用程序可以通過兩種方式獲得寫訪問權限。您可以將要保存上載文件的目錄的寫訪問權限顯式授予運行應用程序所使用的帳戶。您也可以提高為 ASP.NET 應用程序授予的信任級別。若要使應用程序獲得執行目錄的寫訪問權限,必須將 AspNetHostingPermission 對象授予應用程序并將其信任級別設置為 AspNetHostingPermissionLevel..::.Medium 值。提高信任級別可提高應用程序對服務器資源的訪問權限。請注意,該方法并不安全,因為如果懷有惡意的用戶控制了應用程序,他(她)也能以更高的信任級別運行應用程序。最好的做法就是在僅具有運行該應用程序所需的最低特權的用戶上下文中運行 ASP.NET 應用程序。

使用 FileName 屬性來獲取客戶端上將使用 FileUpload 控件上載的文件的名稱。此屬性返回的文件名不包含此文件在客戶端上的路徑。

FileContent 屬性獲取指向要上載的文件的 Stream 對象。使用該屬性以字節方式訪問文件內容。例如,可以使用 FileContent 屬性返回的 Stream 對象以字節方式讀取文件內容并將它們存儲在一個字節數組中。也可以使用 FileBytes 屬性來檢索文件中的所有字節。

PostedFile 屬性獲取要上載的文件的基礎 HttpPostedFile 對象。可以使用此屬性訪問文件的其他屬性。ContentLength 屬性獲取文件的長度。ContentType 屬性獲取文件的 MIME 內容類型。此外,可以使用 PostedFile 屬性來訪問 FileName 屬性、InputStream 屬性和 SaveAs 方法。但是,FileName 屬性、FileContent 屬性和 SaveAs 方法也提供相同的功能。

      防止拒絕服務攻擊的方法之一是限制可以使用 FileUpload 控件上載的文件的大小。應當根據要上載的文件的類型,設置與類型相適應的大小限制。默認的大小限制是 4096 KB,即 4 MB。可以通過設置 httpRuntime 元素的 maxRequestLength 屬性來允許上載更大的文件。若要增加整個應用程序所允許的最大文件大小,請設置 Web.config 文件中的 maxRequestLength 屬性。若要增加指定頁所允許的最大文件大小,請設置 Web.config 中 location 元素內的 maxRequestLength 屬性

      上載較大文件時,用戶也可能接收到以下錯誤消息:

aspnet_wp.exe (PID: 1520) was recycled because memory consumption exceeded 460 MB (60 percent of available RAM).

若用戶遇到此錯誤消息,請增加應用程序的 Web.config 文件的 processModel 元素中的 memoryLimit 屬性的值。memoryLimit 屬性指定了輔助進程可以使用的最大內存量。若輔助進程超出 memoryLimit 量,則創建一個新進程以替換它并將所有當前請求重新分配給新進程。

若要在處理請求時控制將要上載的文件是臨時存儲在內存中還是服務器上,請設置 httpRuntime 元素的 requestLengthDiskThreshold 屬性。使用此屬性,您可以管理輸入流緩沖區的大小。默認值為 256 個字節。您指定的值不應超出為 maxRequestLength 屬性指定的值。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 麻江县| 九寨沟县| 寿宁县| 五华县| 东方市| 海南省| 隆化县| 邵阳市| 修文县| 封开县| 巴南区| 通化县| 新邵县| 黄山市| 东乌珠穆沁旗| 崇文区| 丹阳市| 耿马| 阿坝县| 交城县| 广南县| 湖州市| 眉山市| 九龙城区| 山东| 玉环县| 江山市| 蕲春县| 八宿县| 新巴尔虎右旗| 漯河市| 津市市| 广州市| 宿松县| 叙永县| 沐川县| 镇宁| 苗栗县| 东海县| 鲁山县| 大渡口区|