Share via


上傳檔案 (C#)

作者 :Scott Mitchell

下載 PDF

瞭解如何允許使用者將二進位檔 ( (,例如 Word 或 PDF 檔) 到您的網站,這些檔案可能會儲存在伺服器的檔案系統或資料庫中。

簡介

到目前為止,我們檢查過的所有教學課程都以獨佔方式處理文字數據。 不過,許多應用程式都有可擷取文字和二進位數據的數據模型。 在線數據網站可能會允許用戶上傳圖片,使其與其配置檔產生關聯。 招聘網站可能會讓使用者以 Microsoft Word 或 PDF 檔的形式上傳其履歷。

使用二進位數據會增加一組新的挑戰。 我們必須決定二進位資料儲存在應用程式中的方式。 插入新記錄所用的介面必須更新,讓用戶能夠從其計算機上傳檔案,而且必須採取額外的步驟才能顯示或提供下載記錄相關二進位數據的方法。 在本教學課程和下三個教學課程中,我們將探索如何阻礙這些挑戰。 在這些教學課程結束時,我們將建置功能完整的應用程式,讓圖片和 PDF 折頁簿與每個類別產生關聯。 在此特定教學課程中,我們將探討儲存二進位數據的不同技術,並探索如何讓使用者從計算機上傳檔案,並將其儲存在網頁伺服器的文件系統上。

注意

屬於應用程式數據模型的二進位數據有時稱為 BLOB,這是二進位大型 OBject 的縮寫。 在這些教學課程中,我選擇使用術語二進位數據,雖然 BLOB 一詞是同義字。

步驟 1:建立使用二進位數據網頁

在開始探索新增二進位數據支援的相關挑戰之前,請先花一點時間在網站專案中建立 ASP.NET 頁面,我們將需要本教學課程和下三個。 首先,新增名為 BinaryData的新資料夾。 接下來,將下列 ASP.NET 頁面新增至該資料夾,請務必讓每個頁面與主版頁面產生 Site.master 關聯:

  • Default.aspx
  • FileUpload.aspx
  • DisplayOrDownloadData.aspx
  • UploadInDetailsView.aspx
  • UpdatingAndDeleting.aspx

新增二進位 Data-Related 教學課程的 ASP.NET 頁面

圖 1:為二進位 Data-Related 教學課程新增 ASP.NET 頁面

就像在其他資料夾中一樣, Default.aspx 資料夾中 BinaryData 的 將會列出其區段中的教學課程。 回想一下, SectionLevelTutorialListing.ascx 使用者控件會提供這項功能。 因此,請將此使用者控制件Default.aspx從 方案總管 拖曳至頁面的設計檢視,以將它新增至 。

將 SectionLevelTutorialListing.ascx 使用者控件新增至 Default.aspx

圖 2:新增 SectionLevelTutorialListing.ascx 使用者控件以 Default.aspx (按兩下以檢視完整大小的影像)

最後,將這些頁面新增為檔案中的 Web.sitemap 專案。 具體而言,在增強 GridView <siteMapNode>之後新增下列標記:

<siteMapNode 
    title="Working with Binary Data" 
    url="~/BinaryData/Default.aspx" 
    description="Extend the data model to include collecting binary data.">
    
    <siteMapNode 
        title="Uploading Files" 
        url="~/BinaryData/FileUpload.aspx" 
        description="Examine the different ways to store binary data on the 
                     web server and see how to accept uploaded files from users 
                     with the FileUpload control." />
    <siteMapNode 
        title="Display or Download Binary Data" 
        url="~/BinaryData/DisplayOrDownloadData.aspx" 
        description="Let users view or download the captured binary data." />
    <siteMapNode 
        title="Adding New Binary Data" 
        url="~/BinaryData/UploadInDetailsView.aspx" 
        description="Learn how to augment the inserting interface to 
                     include a FileUpload control." />
    <siteMapNode 
        title="Updating and Deleting Existing Binary Data" 
        url="~/BinaryData/UpdatingAndDeleting.aspx" 
        description="Learn how to update and delete existing binary data." />
</siteMapNode>

更新 Web.sitemap之後,請花點時間透過瀏覽器檢視教學課程網站。 左側功能表現在包含使用二進位數據教學課程的專案。

網站地圖現在包含使用二進位數據教學課程的專案

圖 3:網站地圖現在包含使用二進位數據教學課程的專案

步驟 2:決定儲存二進位數據的位置

與應用程式數據模型相關聯的二進位數據可以儲存在兩個位置的其中一個:在網頁伺服器的檔案系統上,參考儲存在資料庫中的檔案;或直接在資料庫本身 (請參閱圖 4) 。 每個方法都有自己的一組優缺點,並值得更詳細的討論。

二進位數據可以儲存在檔案系統或直接儲存在資料庫中

圖 4:二進位數據可以儲存在文件系統上,或直接儲存在資料庫 (按兩下即可檢視完整大小的映像)

假設我們想要擴充 Northwind 資料庫,讓圖片與每個產品產生關聯。 其中一個選項是將這些圖像檔儲存在網頁伺服器的檔案系統上,並在數據表中 Products 記錄路徑。 透過此方法,我們或許會將數據 ImagePath 行新增至 Products 類型 varchar(200)為的數據表。 當使用者上傳 Chai 的圖片時,該圖片可能會儲存在網頁伺服器的檔案系統 ~/Images/Tea.jpg上,其中 ~ 代表應用程式的實體路徑。 也就是說,如果網站位於實體路徑 C:\Websites\Northwind\的根目錄, ~/Images/Tea.jpg 則 相當於 C:\Websites\Northwind\Images\Tea.jpg。 上傳圖像檔案之後,我們會更新數據表中的 Products Chai 記錄, ImagePath 使其數據行參考新影像的路徑。 我們可以使用 ~/Images/Tea.jpg ,或只是 Tea.jpg 我們決定所有產品映像都會放在應用程式 Images 資料夾中。

將二進位數據儲存在文件系統的主要優點如下:

  • 我們很快就會看到輕鬆實作,儲存和擷取儲存在資料庫中的二進位數據牽涉到的程式代碼比透過文件系統使用數據時多一些。 此外,為了讓用戶檢視或下載二進位數據,他們必須看到該數據的URL。 如果數據位於網頁伺服器的文件系統上,則URL很簡單。 不過,如果數據儲存在資料庫中,則必須建立一個網頁,以從資料庫擷取和傳回數據。
  • 其他服務或應用程式可能需要存取更多二進位數據的二進位數據,這些服務或應用程式無法從資料庫提取數據。 例如,與每個產品相關聯的影像可能也需要透過 FTP 提供給使用者,在此情況下,我們想要將二進位資料儲存在文件系統上。
  • 如果二 進位數據儲存在文件系統上,資料庫伺服器與網頁伺服器之間的需求和網路壅塞將會小於直接儲存在資料庫中的二進位數據。

在文件系統上儲存二進位數據的主要缺點是將數據與資料庫分離。 如果記錄從 Products 數據表中刪除,則不會自動刪除網頁伺服器檔案系統上的關聯檔案。 我們必須撰寫額外的程式代碼來刪除檔案,否則檔案系統將會變得雜亂,且未使用、孤立的檔案。 此外,在備份資料庫時,我們也必須確保備份文件系統上的相關聯二進位數據。 將資料庫移至另一個網站或伺服器會造成類似的挑戰。

或者,建立 類型的varbinary數據行,可以直接儲存在 Microsoft SQL Server 2005 資料庫中。 如同其他可變長度數據類型,您可以指定可保留在此數據行中的二進位數據的最大長度。 例如,若要保留最多 5,000 個字節,請使用 varbinary(5000); varbinary(MAX) 允許記憶體大小上限,約 2 GB。

直接在資料庫中儲存二進位數據的主要優點是二進位數據和資料庫記錄之間的緊密結合。 這可大幅簡化資料庫管理工作,例如備份或將資料庫移至不同的網站或伺服器。 此外,刪除記錄會自動刪除對應的二進位數據。 在資料庫中儲存二進位數據也有更細微的優點。 如需更深入的討論 ,請參閱使用 ASP.NET 2.0 直接在資料庫中儲存二進位檔

注意

在 Microsoft SQL Server 2000 和舊版中varbinary,數據類型的最大限制為 8,000 個字節。 若要儲存最多 2 GB 的二進位數據,image您必須改用數據類型。 不過,在 SQL Server 2005 中新增 MAXimage,數據類型已被取代。 它仍支援回溯相容性,但 Microsoft 宣佈image將在未來的 SQL Server 版本中移除數據類型。

如果您使用較舊的數據模型,您可能會看到 image 資料類型。 Northwind 資料庫數據表 Categories 有一個 Picture 數據行,可用來儲存類別影像檔的二進位數據。 由於 Northwind 資料庫在 Microsoft Access 和舊版 SQL Server 中具有其根目錄,因此此資料行的類型image為 。

在本教學課程和下三個教學課程中,我們將使用這兩種方法。 數據表 Categories 已經有一個 Picture 數據行,用於儲存類別影像的二進位內容。 我們將新增額外的數據行 BrochurePath,以在網頁伺服器的檔系統上儲存 PDF 的路徑,以用來提供類別的列印品質、完善概觀。

步驟 3:將數據BrochurePath行新增至Categories數據表

目前 Categories 資料表只有四個資料列: CategoryIDCategoryNameDescriptionPicture。 除了這些欄位之外,我們需要新增一個新的欄位,以指向類別的摺頁冊 (如果有的話) 。 若要新增此數據行,請移至 [伺服器總管],向下切入至 [數據表],以滑鼠右鍵按兩下 Categories 資料表,然後選擇 [開啟資料表定義] (請參閱圖 5) 。 如果您沒有看到 [伺服器總管],請從 [檢視] 功能選取 [伺服器總管] 選項,或按 Ctrl+Alt+S 來啟動它。

將新的 varchar(200) 數據行新增至 Categories 名為 BrochurePath 且允許 NULL 的數據表,然後按下 [儲存] 圖示 (或按 Ctrl+S) 。

將 BrochurePath 數據行新增至 Categories 數據表

圖 5:將數據行新增 BrochurePathCategories 數據表 (按兩下即可檢視完整大小的影像)

步驟 4:更新架構以使用PictureBrochurePath數據行

資料 CategoriesDataTable 存取層中的 (DAL) 目前已定義四 DataColumn 個: CategoryIDCategoryNameDescriptionNumberOfProducts。 當我們最初在 建立數據存取層 教學課程中設計此 DataTable 時, CategoriesDataTable 只有前三個數據行;數據 NumberOfProducts 行是 使用具有詳細數據清單的主記錄專案符號清單教學課程新增至主要/詳細數據行

建立數據存取層中所述,具型別 DataSet 中的 DataTables 組成商務物件。 TableAdapters 負責與資料庫通訊,並使用查詢結果填入商務物件。 會 CategoriesDataTableCategoriesTableAdapter填入 ,其中包含三個數據擷取方法:

  • GetCategories()會執行 TableAdapter 的主要查詢,並傳回CategoryID數據表中所有記錄的 CategoriesCategoryNameDescription 欄位。 主要查詢是自動產生的 InsertUpdate 方法所使用的查詢。
  • GetCategoryByCategoryID(categoryID) 會傳 CategoryID回類別的、 CategoryNameDescription 欄位,其 CategoryID 等於 categoryID
  • GetCategoriesAndNumberOfProducts()- 傳CategoryID回數據表中所有記錄的 CategoriesCategoryNameDescription 欄位。 也會使用子查詢來傳回與每個類別相關聯的產品數目。

請注意,這些查詢都不會傳回 Categories 資料表 PictureBrochurePath 資料行,也不會 CategoriesDataTable 提供 DataColumn 這些欄位的 。 為了使用 Picture 和 BrochurePath 屬性,我們需要先將它們新增至 CategoriesDataTable ,然後更新 CategoriesTableAdapter 類別以傳回這些數據行。

Picture新增和BrochurePath``DataColumn

首先,將這兩個資料行新增至 CategoriesDataTable。 以滑鼠右鍵按鍵按鍵 CategoriesDataTable ,從操作功能表中選取 [新增],然後選擇 [資料行] 選項。 這會在名為Column1的 DataTable 中建立新的 DataColumn 。 將此資料列重新命名為 Picture。 從 屬性視窗,將 DataColumn s DataType 屬性設定為 System.Byte[] (這不是下拉式清單中的選項;您必須在) 中輸入它。

建立 DataColumn 具名圖片,其 DataType 為 System.Byte[]

圖 6:建立 DataColumn 具名 Picture ,其 DataType (System.Byte[]按兩下即可檢視完整大小的映像)

將另一個DataColumn新增至 DataTable,並使用預設值 DataType (System.String) 命名BrochurePath

從 TableAdapter 傳Picture回 和BrochurePath

將這兩 DataColumn 個 新增至 CategoriesDataTable之後,我們就可以更新 CategoriesTableAdapter。 我們可以在主要 TableAdapter 查詢中傳回這兩個數據行值,但這會在每次叫用 方法時 GetCategories() 傳回二進位數據。 相反地,讓我們更新主要 TableAdapter 查詢,以傳回 BrochurePath 並建立傳回特定類別數據 Picture 行的其他數據擷取方法。

若要更新主要 TableAdapter 查詢,請以滑鼠右鍵按兩下 CategoriesTableAdapter s 標頭,然後從操作選單選擇 [設定] 選項。 這會顯示 [數據表配接器組態精靈],我們在過去幾個教學課程中已看到。 更新查詢以帶回 , BrochurePath 然後按兩下 [完成]。

將 SELECT 語句中的數據行清單更新為同時傳回 BrochurePath

圖 7:將語句中的數據 SELECT 行清單更新為 [同時傳回 BrochurePath (按兩下即可檢視大小完整的映射)

針對 TableAdapter 使用臨機操作 SQL 語句時,更新主要查詢中的數據行清單會更新 TableAdapter 中所有 SELECT 查詢方法的數據行清單。 這表示 GetCategoryByCategoryID(categoryID) 方法已更新以傳回 BrochurePath 數據行,這可能是我們預期的內容。 不過,它也會更新 方法中的數據 GetCategoriesAndNumberOfProducts() 行清單,移除傳回每個類別產品數目的子查詢! 因此,我們需要更新這個方法的 SELECT 查詢。 以滑鼠右鍵按下 GetCategoriesAndNumberOfProducts() 方法,選擇 [設定],然後將查詢還原 SELECT 回其原始值:

SELECT CategoryID, CategoryName, Description, 
       (SELECT COUNT(*) 
            FROM Products p 
            WHERE p.CategoryID = c.CategoryID) 
       as NumberOfProducts
FROM Categories c

接下來,建立傳回特定類別數據 Picture 行值的新 TableAdapter 方法。 以滑鼠右鍵按兩下 s 標頭, CategoriesTableAdapter 然後選擇 [新增查詢] 選項以啟動 TableAdapter 查詢設定精靈。 此精靈的第一個步驟會詢問我們是否要使用臨機操作 SQL 語句、新的預存程式或現有的語句來查詢數據。 選取 [使用 SQL 語句],然後按 [下一步]。 由於我們將傳回數據列,因此請選擇 SELECT,以從第二個步驟傳回數據列選項。

選取 [使用 SQL 語句選項]

圖 8:選取 [使用 SQL 語句選項] (按兩下即可檢視大小完整的影像)

由於查詢會從類別數據表傳回記錄,請選擇會傳回數據列的SELECT

圖 9:由於查詢會從類別數據表傳回記錄,請選擇 SELECT 以傳回數據列 (按兩下即可檢視大小完整的影像)

在第三個步驟中,輸入下列 SQL 查詢,然後按 [下一步]:

SELECT     CategoryID, CategoryName, Description, BrochurePath, Picture
FROM       Categories
WHERE      CategoryID = @CategoryID

最後一個步驟是選擇新方法的名稱。 分別使用 FillCategoryWithBinaryDataByCategoryIDGetCategoryWithBinaryDataByCategoryID 來填滿 DataTable 並傳回 DataTable 模式。 按一下 [完成] 以完成精靈。

選擇 TableAdapter s 方法的名稱

圖 10:選擇 TableAdapter s 方法的名稱, (按兩下即可檢視完整大小的影像)

注意

完成 [資料表配接器查詢設定精靈] 之後,您可能會看到一個對話框,通知您新的命令文字會傳回架構與主要查詢架構不同的數據。 簡單來說,精靈指出 TableAdapter 的主要查詢 GetCategories() 會傳回不同於我們剛才建立的架構。 但這是我們想要的,因此您可以忽略此訊息。

此外,請記住,如果您使用臨機操作 SQL 語句,並使用精靈在稍後的時間點變更 TableAdapter 的主要查詢,它會修改 GetCategoryWithBinaryDataByCategoryID 方法的 SELECT 語句數據行清單,只包含來自主要查詢 (的數據行,它會 Picture 從查詢中移除數據行) 。 您必須手動更新資料行清單以傳回數據 Picture 行,類似於 GetCategoriesAndNumberOfProducts() 我們稍早在此步驟中使用 方法所做的動作。

將兩DataColumn個 新增至 CategoriesDataTableGetCategoryWithBinaryDataByCategoryID 方法之後CategoriesTableAdapter,Typed DataSet 中的這些類別 Designer 看起來應該像圖 11 中的螢幕快照。

DataSet Designer 包含新的數據行和方法

圖 11:D ataSet Designer 包含新的數據行和方法

更新商業規則層 (BLL)

在 DAL 更新後,所有保留專案都是增強商業規則層 (BLL) ,以包含新 CategoriesTableAdapter 方法的方法。 將下列方法新增至 CategoriesBLL 類別:

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Select, false)] 
public Northwind.CategoriesDataTable 
    GetCategoryWithBinaryDataByCategoryID(int categoryID)
{
    return Adapter.GetCategoryWithBinaryDataByCategoryID(categoryID);
}

步驟 5:將檔案從用戶端上傳至網頁伺服器

收集二進位數據時,通常會由使用者提供此數據。 若要擷取此資訊,用戶必須能夠將檔案從其計算機上傳至網頁伺服器。 接著,上傳的數據必須與數據模型整合,這可能表示將檔案儲存至網頁伺服器的檔系統,並將路徑新增至資料庫中的檔案,或直接將二進位內容寫入資料庫。 在此步驟中,我們將探討如何允許使用者將檔案從其計算機上傳至伺服器。 在下一個教學課程中,我們將注意將上傳的檔案與數據模型整合。

ASP.NET 2.0 s 新的 FileUpload Web 控制項 提供一種機制,讓使用者從電腦將檔案傳送至網頁伺服器。 FileUpload 控件會轉譯為 <input> 屬性設定為檔案的專案 type ,瀏覽器會顯示為具有 [流覽] 按鈕的文字框。 按兩下 [瀏覽] 按鈕會顯示一個對話框,使用者可以從中選取檔案。 當窗體回傳時,選取的檔案內容會連同回傳一起傳送。 在伺服器端,可透過 FileUpload 控件的屬性存取已上傳檔案的相關信息。

若要示範上傳檔案,請開啟FileUpload.aspx資料夾中的頁面BinaryData、將 FileUpload 控制件從 [工具箱] 拖曳至 Designer,並將控制件的 ID 屬性設定為 UploadTest。 接下來,分別將按鈕 Web 控件的 IDText 屬性新增至 UploadButton 和上傳選取的檔案。 最後,將標籤 Web 控制件放在 Button 下方,清除其 Text 屬性,並將其 屬性設定 IDUploadDetails

將 FileUpload 控件新增至 ASP.NET 頁面

圖 12:將 FileUpload 控件新增至 ASP.NET 頁面 (按兩下即可檢視完整大小的影像)

圖 13 顯示透過瀏覽器檢視此頁面。 請注意,按兩下 [瀏覽] 按鈕會顯示檔案選取對話框,讓使用者從計算機挑選檔案。 選取檔案之後,按兩下 [上傳選取的檔案] 按鈕會導致將選取的檔案二進位內容傳回至網頁伺服器。

用戶可以選取要從電腦上傳至伺服器的檔案

圖 13:使用者可以選取要從計算機上傳至伺服器 (按兩下以檢視完整大小的映像)

在回傳時,上傳的檔案可以儲存至文件系統,或其二進位數據可以直接透過 Stream 使用。 在此範例中,讓我們建立 ~/Brochures 資料夾,並在該處儲存上傳的檔案。 首先,將 Brochures 資料夾新增至月臺做為根目錄的子資料夾。 接下來,建立 UploadButton s Click 事件的事件處理程式,並新增下列程式代碼:

protected void UploadButton_Click(object sender, EventArgs e)
{
    if (UploadTest.HasFile == false)
    {
        // No file uploaded!
        UploadDetails.Text = "Please first select a file to upload...";            
    }
    else
    {
        // Display the uploaded file's details
        UploadDetails.Text = string.Format(
                @"Uploaded file: {0}<br />
                  File size (in bytes): {1:N0}<br />
                  Content-type: {2}", 
                  UploadTest.FileName, 
                  UploadTest.FileBytes.Length,
                  UploadTest.PostedFile.ContentType);
        // Save the file
        string filePath = 
            Server.MapPath("~/Brochures/" + UploadTest.FileName);
        UploadTest.SaveAs(filePath);
    }
}

FileUpload 控件提供各種屬性來處理上傳的數據。 例如, HasFile 屬性 會指出是否由用戶上傳檔案,而 FileBytes 屬性 則提供上傳的二進位數據做為位元組陣列的存取權。 事件處理程式會 Click 從確保檔案已上傳開始。 如果檔案已上傳,標籤會顯示已上傳檔案的名稱、大小以位元組為單位,以及其內容類型。

注意

若要確保使用者上傳檔案,您可以檢查 屬性, HasFile 並在其為 時 false顯示警告,或者您可以改用 RequiredFieldValidator 控件

FileUpload s SaveAs(filePath) 會將上傳的檔案儲存至指定的 filePathfilePath 必須是 實體路徑 () C:\Websites\Brochures\SomeFile.pdf ,而不是 虛擬路徑 (/Brochures/SomeFile.pdf) 。 方法會Server.MapPath(virtPath)採用虛擬路徑,並傳回其對應的實體路徑。 在這裡,虛擬路徑是 ~/Brochures/fileName,其中 fileName 是上傳的檔名。 如需虛擬和實體路徑和使用Server.MapPath的詳細資訊,請參閱 Server.MapPath 方法

完成 Click 事件處理程序之後,請花點時間在瀏覽器中測試頁面。 按兩下 [瀏覽] 按鈕,然後從硬碟選取檔案,然後按兩下 [上傳選取的檔案] 按鈕。 回傳會將所選檔案的內容傳送至網頁伺服器,然後顯示檔案的相關信息,再將它儲存到 ~/Brochures 資料夾。 上傳檔案之後,返回 Visual Studio,然後按兩下 方案總管 中的 [重新整理] 按鈕。 您應該會在 ~/Brochures 資料夾中看到您剛才上傳的檔案!

檔案 EvolutionValley.jpg 已上傳至網頁伺服器

圖 14:檔案 EvolutionValley.jpg 已上傳至網頁伺服器 (按兩下以檢視完整大小的映像)

EvolutionValley.jpg 已儲存至 ~/Brochures 資料夾

圖 15EvolutionValley.jpg 已儲存至 ~/Brochures 資料夾

將上傳的檔案儲存至文件系統的細微之處

將檔案儲存至網頁伺服器文件系統時,必須解決幾個細微之處。 首先,安全性問題。 若要將檔案儲存至檔案系統,執行 ASP.NET 頁面的安全性內容必須具有寫入許可權。 ASP.NET 開發 Web 伺服器會在您目前用戶帳戶的內容下執行。 如果您使用 Microsoft 的 Internet Information Services (IIS) 作為網頁伺服器,安全性內容取決於 IIS 的版本及其設定。

將檔案儲存至文件系統的另一項挑戰是圍繞命名檔案。 目前,我們的頁面會使用與用戶端計算機上檔案相同的名稱,將所有上傳的檔案儲存到 ~/Brochures 目錄。 如果使用者 A 上傳名稱 Brochure.pdf為 的折頁簿,檔案將會儲存為 ~/Brochure/Brochure.pdf。 但如果稍後使用者 B 上傳發生相同檔名的不同折頁冊檔案, (Brochure.pdf) 該怎麼辦? 使用我們現在擁有的程式代碼,使用者 A 檔案將會以使用者 B 上傳覆寫。

有數種解決檔名衝突的技術。 其中一個選項是如果已經有同名的檔案存在,則禁止上傳檔案。 使用此方法時,當使用者 B 嘗試上傳名為 Brochure.pdf的檔案時,系統不會儲存其檔案,而是顯示一則訊息,通知使用者 B 重新命名檔案,然後再試一次。 另一種方法是使用唯一檔名來儲存盤案,這可能是 全域唯一標識符 (GUID) ,或是對應資料庫記錄主鍵數據行的值, (s) (假設上傳與數據模型中的特定數據列相關聯) 。 在下一個教學課程中,我們將更詳細地探索這些選項。

涉及非常大量二進位數據的挑戰

這些教學課程假設所擷取的二進位數據大小適中。 使用非常大量的二進位數據文件,這些檔案是數 MB 或更大的,會產生超出這些教學課程範圍的新挑戰。 例如,根據預設,ASP.NET 會拒絕超過4 MB的上傳,不過這可以透過 <httpRuntime> 中的Web.config元素進行設定。 IIS 也會限制自己的檔案上傳大小限制。 此外,上傳大型檔案所花費的時間可能超過預設的 110 秒,ASP.NET 會等候要求。 使用大型檔案時,也會發生記憶體和效能問題。

FileUpload 控件不適用於大型檔案上傳。 當檔案的內容張貼到伺服器時,用戶必須耐心等候,而不會確認其上傳正在進行。 處理可在幾秒鐘內上傳的較小檔案時,這並不多一個問題,但在處理可能需要幾分鐘才能上傳的較大檔案時,可能是問題。 有許多第三方檔案上傳控件更適合處理大型上傳,而其中許多廠商提供進度指標和 ActiveX 上傳管理員,這些控件提供更完善的用戶體驗。

如果您的應用程式需要處理大型檔案,您必須仔細調查挑戰,並找出適合您特定需求的解決方案。

摘要

建置需要擷取二進位數據的應用程式會產生一些挑戰。 在本教學課程中,我們探索了前兩項:決定儲存二進位數據的位置,並允許使用者透過網頁上傳二進位內容。 在接下來的三個教學課程中,我們將瞭解如何將上傳的數據與資料庫中的記錄產生關聯,以及如何與其文字數據欄位一起顯示二進位數據。

快樂的程序設計!

深入閱讀

如需本教學課程中討論之主題的詳細資訊,請參閱下列資源:

關於作者

Scott Mitchell 是七份 ASP/ASP.NET 書籍的作者,以及 1998 年以來與 Microsoft Web 技術合作的 4GuysFromRolla.com 作者。 Scott 是獨立顧問、訓練員和作者。 他的最新書籍是 Sams 在 24 小時內自行 ASP.NET 2.0。 您可以透過mitchell@4GuysFromRolla.com部落格來連線到 ,您可以在 找到http://ScottOnWriting.NET

特別感謝

本教學課程系列是由許多實用的檢閱者檢閱。 本教學課程的首席檢閱者是 Teresa Murphy 和 Bernadette 一文。 有興趣檢閱即將推出的 MSDN 文章嗎? 如果是,請將一行 mitchell@4GuysFromRolla.com放在 。