一般在使用UploadFile的元件時我們大多會將檔案存到Server上的實體路徑中,但在某些時候我們也會將附件直接存到資料庫中,這兩種作法在市面上都有人在使用
一般在使用UploadFile的元件時我們大多會將檔案存到Server上的實體路徑中,但在某些時候我們也會將附件直接存到資料庫中,這兩種作法在市面上都有人在使用,以下簡單比較一下兩者的優缺點:
檔案附件(實體檔):
優點:可做File Server,方便共享文件,搭配文管系統使用時很方便....
缺點:檔案的備份或移機不易、若文件不進行加密可能會被沒有權限的人竊取、檔案的全文檢索功能較困難。
資料附件(存DB):
優點:可直接備份DB、可透過系統進行附件的權限管制、搭配SQL Server可做附件的全文檢索....
缺點:DB的容積成長快速,容易影響效率....
其實兩者還有蠻多的差別我這邊沒有列出,但原則上適合用哪一個我倒覺得需要看狀況,下面簡單介紹一下如何透過UploadFile元件進行檔案的上傳:
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怎麼寫這邊不多說明)。
然後我們可以透過下面這端程式來下載剛剛上傳到資料庫中的資料:
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堂課》,為培養台灣未來的領袖而努力。 |