2006/06/29

用 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 即可。

2006/06/21

Bittorent 整合入 Ubuntu

昨晚原本要從 eclipse main site 下載 eclipse 3.1.2,但速度卻慢到想殺人。後來想說就載 torrent 下來,再看看要用什麼來下載。沒想到一打開預設的應用程式就是 Bittorrent。選擇要下載到哪裡,按下確定後就開始下載了。

原來現在這麼方便,看來我過太久的原始人生活,腦袋都退化了。

Bittorrent 整合入 ubuntu

2006/06/17

Google PIM

最近 Google Calendar 也加入 Google Personalized 行列之後,又找到了 Google Todo 的 widget,這樣一來所有 PIM 的功能都有了:電子郵件、行事曆、待辦事項,再加上搜尋紀錄、del.icio.us 書籤外加用不太習慣的 Google RSS Reader。這樣我最常用的功能都有了,剩下最後一件事情,就是跟 PDA 同步 ;-)

一直以來都是用 GNOME Project 底下的 Evolution,但 Google Personalized 卻提供了更完備、方便的功能與特性。再見啦!Evolution!

screenshot-google-ig

2006/06/14

睜眼說瞎話

睜眼說瞎話

我實在搞不懂,不安裝這個『高優先性的更新』會導致什麼危險,電腦會爆炸嗎?

2006/06/13

BenQ 海貝換成 Wintek WK230

連看了幾天鍵盤勸敗文,後來還是忍不住到順發買隻 Wintek WK230 回來,花了455大洋。不過這隻鍵盤按鍵比我想像的輕多了。還真是不適應阿。但最大的好處是,終於擺脫海貝那種奇怪的 Function 鍵配置了。

Happy shopping!

Google 的線上付費服務 - Gbuy

我要說的是,這個名字很好笑阿 XD

想必推出時一定會遭眾台灣 blogger 調侃一番。

2006/06/10

[tip] 如何讓 ubuntu 6.06 播放影音常用格式?

ubuntu 6.06 預設的音樂播放器 rhythmbox 無法播放 mp3 格式的音樂,主要是因為 gstreamer 不支援。如果要讓您的 gstreamer 支援 mp3 格式,請安裝 gstreamer0.10-plugins-ugly, 若要支援 WMV 等常用影片格式,請安裝 gstreamer0.10-ffmpeg:

sudo aptitude install gstreamer0.10-plugins-ugly gstreamer0.10-ffmpeg

至於 mp3 tag 亂碼問題怎麼解決我就不知道了,因為我的 MP3 音樂都是自己轉的,採 UTF-8 編碼就沒有問題 :P

BTW, 在 Windows 以下使用 iTunes 轉音樂會採用 UTF-8,不過如果用邪惡的 Windows Media Player 轉換在 Linux 底下就會有亂碼。

2006/06/06

不錯的論文摘要

最近正閱讀這篇論文:BATON: A Balanced Tree Structure for Peer-to-Peer Networks

覺得這篇論文的摘要寫的蠻不錯的。以前看論文的摘要通常讓我感覺繞了一大圈,到最後幾句才知道這篇論文到底想幹嘛,但這篇從一開始就表明這篇論文的重點,然後再逐漸引出論文的重要性,讓人看完之後對這篇論文產生很大的興趣。

文筆的好壞,從摘要就看得出來 :)

BTW, 想到自己的論文還真覺得是亂七八糟阿。

2006/06/05

OLPC

OLPC, The One Laptop per Child.

雖然這個計畫的立意很棒,但對於科技最終是要入侵地球的每一寸土地,總還是有些疑惑。當最後一個原始部落也都擁有了科技玩意後,他們真的會比生活在原始生活中還要快樂?我想也不一定吧。

2006/06/04

OLPC 展示影片

Engadget 今天貼出了 OLPC 展示影片囉,有興趣的可以看一下。這樣看起來跟一般的 fedora core 差不多,而且用的是 GNOME。

2006/06/01

AMD 欲合併 ATI?

超級 shock 的新聞 :)

今天在 OSNews engadget 上分別報導了 AMD 有可能買下 ATI。衝阿!AMD 趕快打倒邪惡的 Intel 大軍,變成邪惡的 AMD 吧!