首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 檔案上傳至資料庫完整解決方案

     編輯:ASP.NET 基礎

資料表設計

CREATE TABLE tblBooksUpload (
    DocID     INT IDENTITY PRIMARY KEY,
    DocTitle  VARCHAR(200),
    Doc       IMAGE,              -- 二進位檔案內容
    DocType   VARCHAR(50),        -- 副檔名/MIME 類型,供瀏覽器正確呈現
    EntryDate DATETIME DEFAULT GETDATE()
);

預存程序

CREATE PROCEDURE usp_BooksUploadFile
    @Title   VARCHAR(200),
    @Doc     IMAGE,
    @DocType VARCHAR(4)
AS
    INSERT INTO tblBooksUpload (DocTitle, Doc, DocType)
    VALUES (@Title, @Doc, @DocType);

前端上傳表單

<form id="frmUpload" method="post" enctype="multipart/form-data" runat="server">
    <asp:TextBox ID="txtTitle" runat="server" />
    <asp:RequiredFieldValidator ControlToValidate="txtTitle" ErrorMessage="* 標題必填" runat="server" />
<input id="fuFile" type="file" runat="server" />
<asp:Button ID="btnSubmit" runat="server" Text="上傳" OnClick="btnSubmit_Click" /> </form>

後端核心邏輯

protected void btnSubmit_Click(object sender, EventArgs e)
{
    if (!Page.IsValid || fuFile.PostedFile == null || fuFile.PostedFile.ContentLength == 0)
        return;

    // 1. 判斷副檔名對應 DocType
    string ext = Path.GetExtension(fuFile.PostedFile.FileName).ToLower();
    string docType = ext switch
    {
        ".doc" => "doc", ".docx" => "docx",
        ".pdf" => "pdf",
        ".jpg" or ".jpeg" => "jpg",
        ".png" => "png",
        ".gif" => "gif",
        _ => "bin"
    };

    // 2. 讀取檔案到位元組陣列
    int len = fuFile.PostedFile.ContentLength;
    byte[] buffer = new byte[len];
    using (Stream s = fuFile.PostedFile.InputStream)
        s.Read(buffer, 0, len);

    // 3. 參數化寫入資料庫
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Books"].ConnectionString))
    using (SqlCommand cmd = new SqlCommand("usp_BooksUploadFile", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@Title", SqlDbType.VarChar, 200).Value = txtTitle.Text;
        cmd.Parameters.Add("@Doc", SqlDbType.Image).Value = buffer;
        cmd.Parameters.Add("@DocType", SqlDbType.VarChar, 4).Value = docType;

        conn.Open();
        cmd.ExecuteNonQuery();
    }
    lblMsg.Text = "上傳成功";
}

下載/預覽實作要點

  • 建立 Download.ashx 一般處理常式,依 DocID 查詢資料庫,Response.ContentType = row["DocType"],Response.BinaryWrite((byte[])row["Doc"])。
  • 圖片類型可直接在 <img src="Download.ashx?id=123" /> 顯示。
  • 大檔建議分塊讀寫或使用 FILESTREAM / FileTable (SQL Server 2012+) 避免記憶體壓力。

優缺點評估

優點缺點
檔案與資料庫交易一致性(備份/還原單一 .bak)資料庫體積快速膨脹,備份/還原耗時
權限控管集中在資料庫層級讀取需經由程式碼,無法直接靜態連結/CDN 加速
刪除參考即刪除檔案,無孤兒檔大量二進位資料影響緩衝池效能

建議:小檔(文件、圖示)可存資料庫;大檔(影片、備份)存檔案系統/雲端儲存,資料庫僅存路徑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved