ASP.NET控制項之FileUpload控制項

來源:互聯網
上載者:User

使用 FileUpload 控制項,可以為使用者提供一種將檔案從其電腦發送到伺服器的方法。

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

使使用者能夠上傳儲存在伺服器上的特定位置的檔案。

限制可上傳的檔案的大小。

在儲存上傳的檔案之前檢查其屬性。

FileUpload 控制項使使用者能夠上傳圖片、文字檔或其他檔案。FileUpload 控制項顯示一個文字框,在此使用者可以鍵入希望上傳到伺服器的檔案的名稱。該控制項還顯示一個“瀏覽”按鈕,該按鈕顯示一個檔案導航對話方塊。(顯示的對話方塊取決於使用者電腦的作業系統。) 出於安全方面的考慮,不能將檔案名稱預先載入到 FileUpload 控制項中。

處理上傳的檔案
當使用者已選定要上傳的檔案並提交頁時,該檔案將作為請求的一部分上傳。檔案將被完整地緩衝在伺服器記憶體中。檔案完成上傳後,頁代碼開始運行。

可以通過下面的方式訪問上傳的檔案:

作為在 FileUpload 控制項的 FileBytes 屬性中公開的位元組數組。

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

作為 PostedFile 屬性中類型 HttpPostedFile 的對象。PostedFile 對象公開一些屬性,如 ContentType 和 ContentLength 屬性,這些屬性為您提供有關上傳的檔案的資訊。

在代碼運行時,可以檢查檔案的特徵,例如檔案的名稱、大小和 MIME 類型,然後可以儲存該檔案。可以將檔案當作位元組數組或流來使用。另外,FileUpload 控制項和 HttpPostedFile 對象都支援將檔案寫入磁碟的 SaveAs 方法。

對所上傳檔案的儲存位置,沒有固有限制。但是,若要儲存檔案,ASP.NET 進程必須具有在指定位置建立檔案的許可權。此外,還可能將應用程式配置為要求使用絕對路徑(而不是相對路徑)來儲存檔案,這是一種安全措施。如果將 httpRuntime 配置元素的 requireRootedSaveAsPath 屬性設定為 true(預設值),則在儲存上傳的檔案時必須提供絕對路徑。

可以建立基於應用程式根資料夾的絕對路徑,方法是使用 HttpServerUtility 類的 MapPath 方法,並將表示應用程式根資料夾的顎化符 (~) 傳遞給該方法。

可上傳的最大檔案的大小取決於 MaxRequestLength 配置設定的值。如果使用者試圖上傳大於最大允許值的檔案,則上傳會失敗。

在部分頁更新中使用 FileUpload 控制項
FileUpload 控制項設計為僅用於回傳方案,而不適用於部分頁呈現期間的非同步回傳方案。當您在 UpdatePanel 控制項內部使用 FileUpload 控制項時,必須使用作為面板的一個 PostBackTrigger 對象的控制項來上傳檔案。UpdatePanel 控制項用於更新頁的選定地區,而不是使用回傳來更新整個頁面。

 

安全性和 FileUpload 控制項
通過使用 FileUpload 控制項,使用者可以上傳可能存在惡意的檔案,其中包含指令檔和可執行檔。無法預先限制使用者可以上傳的檔案。如果希望限制使用者可以上傳的檔案的類型,則必須在上傳檔案後檢查檔案特徵,如檔案的副檔名和檔案的 ContentType 屬性的值。

在提交頁面之前,可以使用用戶端指令碼來檢查使用者在文字框中鍵入的檔案名稱。儘管在用戶端執行檔案名稱檢查會很有用,但這並不能保證使用者無法上傳不安全的檔案類型,如可執行檔。

使用 FileUpload Web 伺服器控制項上傳檔案

1.向頁面添加 FileUpload 控制項。

出於安全方面的考慮,不能將檔案名稱預先載入到 FileUpload 控制項中。

2.在事件(如該頁的 Load 事件)的處理常式中,執行下面的操作:

a.通過測試 FileUpload 控制項的 HasFile 屬性,檢查該控制項是否有上傳的檔案。

b.檢查該檔案的檔案名稱或 MIME 類型以確保使用者已上傳了您要接收的檔案。若要檢查 MIME 類型,請擷取作為 FileUpload 控制項的 PostedFile 屬性公開的 HttpPostedFile 對象。然後,通過查看已傳送檔案的 ContentType 屬性,就可以擷取該檔案的 MIME 類型。

在某些情況下,已上傳檔案的 MIME 類型可能是偽造的,因此只檢查檔案的 MIME 類型不是一種可靠的安全檢查。

c.將該檔案儲存到您指定的位置。您可以調用 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.";
        }
    }
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.