[ASP.NET]透過UploadFile元件進行資料附件

一般在使用UploadFile的元件時我們大多會將檔案存到Server上的實體路徑中,但在某些時候我們也會將附件直接存到資料庫中,這兩種作法在市面上都有人在使用

一般在使用UploadFile的元件時我們大多會將檔案存到Server上的實體路徑中,但在某些時候我們也會將附件直接存到資料庫中,這兩種作法在市面上都有人在使用,以下簡單比較一下兩者的優缺點:

檔案附件(實體檔):

優點:可做File Server,方便共享文件,搭配文管系統使用時很方便....

缺點:檔案的備份或移機不易、若文件不進行加密可能會被沒有權限的人竊取、檔案的全文檢索功能較困難。

資料附件(存DB):

優點:可直接備份DB、可透過系統進行附件的權限管制、搭配SQL Server可做附件的全文檢索....

缺點:DB的容積成長快速,容易影響效率....

其實兩者還有蠻多的差別我這邊沒有列出,但原則上適合用哪一個我倒覺得需要看狀況,下面簡單介紹一下如何透過UploadFile元件進行檔案的上傳:

01         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怎麼寫這邊不多說明)。

然後我們可以透過下面這端程式來下載剛剛上傳到資料庫中的資料:

01         //讀出該筆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堂課》,為培養台灣未來的領袖而努力。