用 ASP.NET 2.0 製作檔案上傳 + MD5 驗證

像 ASP.NET 2.0 有這~~~~麼方便的開發工具 - Visual Web Developer (VWD),無論如何都會讓人想到,只要把資料庫欄位設定一下, controls 拖出來,打幾行不是程式的程式,就可以完成這項功能。

但很遺憾,事情並沒有那麼容易。

情境: 製作一個可以儲存 PDF 文件的資料表,並且使用 MD5sum 作為 table 的 primary key,並且有欄位專儲存名稱、出處、發表年份等資料。

喔,這看起來不難,所以我就用 Boss 諭令指定的 VWD 開始寫。剛開始覺得很噁心,因為 SQL command 跟網頁都混在一起,厲害的是雖然 VWD 將網頁樣板放在一個檔案(aspx),另抽出一個 Class 專門撰寫程式(cs),但卻把 SQL Command 儲存在 aspx 檔案裡面!雖然很方便,但是以前沒這樣寫過,覺得真是噁心…。

不過很快的就完成 Form 了,所以是有好壞啦。接著按下 run。填完資料按下確認。啥? image 與 sql_variant blah blah balh…,我從來沒有指定過這種資料型態阿?接著,我就跟 VWD 奮戰了一天…。

看起來是內部處理的機制弄錯了,搞得不能直接拉拉元件就上傳。後來就先在 insert 資料前的 event handler ItemInserting 先插入資料,順便產生 MD5sum:

    FileUpload uploader = (FileUpload)FormView1.FindControl("FileUpload_paper_file");   byte[] imgBytes = uploader.FileBytes;   MD5 hasher = MD5.Create();   byte[] data = hasher.ComputeHash(imgBytes);   StringBuilder builder = new StringBuilder();      for (int i = 0; i < data.Length; i++)   {   builder.Append(data[i].ToString("x2"));   }   string md5sum = builder.ToString();      e.Values["md5sum"] = md5sum;   this.md5sum = md5sum;

然後資料插入後,再用一個 event ItemInserted 傳上圖檔:

    string connStr = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;   SqlConnection conn = new SqlConnection(connStr);   conn.Open();   SqlCommand cmd = new SqlCommand("UPDATE [paper] SET [paper_file] = @paper_file WHERE md5sum = @md5sum", conn);   SqlParameter parm = new SqlParameter("md5sum", this.md5sum);   cmd.Parameters.Add(parm);   parm = new SqlParameter("paper_file", imgBytes);   parm.SqlDbType = SqlDbType.Image;   cmd.Parameters.Add(parm);   cmd.ExecuteNonQuery();   conn.Close();

這…真是繞了一大圈阿。

[UPDATE] 不好意思,繞了一大圈的是我。只要在插入資料後產生 MD5sum 即可。


讀者回函
讀完本文之後有什麼建議或回饋嗎?請按此在 Twitter 上面分享此文並且提及我,或是透過寄送電子郵件分享你的看法 😎