一般在使用UploadFile的元件時我們大多會將檔案存到Server上的實體路徑中,但在某些時候我們也會將附件直接存到資料庫中,這兩種作法在市面上都有人在使用
一般在使用UploadFile的元件時我們大多會將檔案存到Server上的實體路徑中,但在某些時候我們也會將附件直接存到資料庫中,這兩種作法在市面上都有人在使用,以下簡單比較一下兩者的優缺點:
檔案附件(實體檔):
優點:可做File Server,方便共享文件,搭配文管系統使用時很方便....
缺點:檔案的備份或移機不易、若文件不進行加密可能會被沒有權限的人竊取、檔案的全文檢索功能較困難。
資料附件(存DB):
優點:可直接備份DB、可透過系統進行附件的權限管制、搭配SQL Server可做附件的全文檢索....
缺點:DB的容積成長快速,容易影響效率....
其實兩者還有蠻多的差別我這邊沒有列出,但原則上適合用哪一個我倒覺得需要看狀況,下面簡單介紹一下如何透過UploadFile元件進行檔案的上傳:
HttpPostedFile tPostedFile = upload.PostedFile; 02
//取得檔案大小 03
tFileLength = tPostedFile.ContentLength; 04
//取得檔名 05
tPostedFileName = tPostedFile.FileName; 06
07
byte[] tData = new byte[tFileLength]; 08
if (pPostedFile != null) 09
{ 10
tPostedFile.InputStream.Read(tData, 0, tFileLength); 11
} 12
//用FileStream做讀檔動作 13
else 14
{ 15
FileStream tStream = new FileStream(tPostedFileName, System.IO.FileMode.Open); 16
//將Postfile轉成byte[]格式 17
tStream.Read(tData, 0, tFileLength); 18
tStream.Close(); 19
}根據以上的寫法,我們可以將PostedFile轉成byte[]格式,然透insert進image型態的資料庫欄位中(此例中欄位名稱是Content,SQL怎麼寫這邊不多說明)。
然後我們可以透過下面這端程式來下載剛剛上傳到資料庫中的資料:
//讀出該筆Row,Content是上傳時的image欄位,用來放附件的 02
if ((tDr["Content"] != null) && (tDr["Content"] != System.DBNull.Value)) 03
{ 04
Response.Clear(); 05
Response.Buffer = true; 06
//Title是檔案名稱、FileType是副檔名 07
Response.AppendHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(tDr["Title"].ToString(), Encoding.UTF8) + "." + tDr["FileType"].ToString()); 08
Response.ContentType = "application/octet-stream"; 09
Response.ContentEncoding = System.Text.Encoding.GetEncoding("Big5"); 10
byte[] tData = (byte[])tDr["Content"]; 11
Response.OutputStream.Write(tData, 0, tData.Length); 12
Response.End(); 13
}上傳與下載之間還有Key需要對應,如果附件清單是用GridView來呈現的話,可直接取得對應的Key去找出該筆Row,指定好下載的檔名跟內容後就可以直接下載此檔案囉。
![]() |
游舒帆 (gipi) 探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。 |

