首先是在Access中建立一個表,這個表中用了存儲圖片檔的欄位的類型設置為 OLE 物件,
然後就是使用一個 FileUpLoad 上傳一張圖片,再讀取上傳的圖片的位元組流,並且將其儲存在Access資料庫中,
最後再使用一個泛型程式處理一下,讀取出圖片並且使用其得到的資料流程來初始化成一張圖片,
即將資料流程重新寫回圖片,再在 Image 控制項上顯現出來



上傳到Access中的代碼大致如下:
if (!FileUpload1.HasFile)
{
Label1.Text = "請先選擇要上傳的圖片檔";
return;
}
string[] allowType = new string[4];
allowType[0] = ".jpg";
allowType[1] = ".jpeg";
allowType[2] = ".gif";
allowType[3] = ".png";
bool allow = false;
foreach (string str in allowType)
{
if (str == System.IO.Path.GetExtension(FileUpload1.FileName).ToLower())
{
allow = true;
break;
}
}
if (allow == false)
{
Label1.Text = "你上傳的圖片格式不正確,請選擇 .Jpg,.Jpeg,.Gif,.Png 格式的圖片";
return;
}
string conStr = "Provider=Microsoft.Ace.OleDb.12.0;";
conStr += @"Data Source=E:\資料庫\XiaoZhen.accdb;";
string accessStr = "Insert Into 相冊(相片名,大小,上傳日期,相片) " +
"Values(@Name,@Length,@Date,@Photo)";
string name = FileUpload1.PostedFile.FileName.ToString();
string length = FileUpload1.PostedFile.ContentLength.ToString();
string date = DateTime.Now.ToShortDateString();
try
{
using (OleDbConnection oleDbCon = new OleDbConnection(conStr))
{
oleDbCon.Open();
using (OleDbCommand oleDbCom = oleDbCon.CreateCommand())
{
oleDbCom.CommandType = CommandType.Text;
oleDbCom.CommandText = accessStr;
oleDbCom.Parameters.AddWithValue("@Name", name);
oleDbCom.Parameters.AddWithValue("@Length", length);
oleDbCom.Parameters.AddWithValue("@Date", date);
oleDbCom.Parameters.Add("@Photo", OleDbType.LongVarBinary).Value = FileUpload1.FileBytes;
oleDbCom.ExecuteNonQuery();
Label1.Text = "恭喜你,圖片上傳成功";
}
}
}
catch (Exception E)
{
Label1.Text = E.Message.ToString();
}



泛型程式碼則是取出圖片並且顯現,代碼大致如下:
string conStr = "Provider=Microsoft.Ace.OleDb.12.0;";
conStr += @"Data Source=E:\資料庫\XiaoZhen.accdb;";
string photoName = coNtext.Request.QueryString["PhotoName"].ToString();
string accessAtr = "Select 相片 From 相冊 Where 相片名='" + photoName + "'";
try
{
using (OleDbConnection oleDbCon = new OleDbConnection(conStr))
{
oleDbCon.Open();
using (OleDbCommand oleDbCom = oleDbCon.CreateCommand())
{
oleDbCom.CommandType = CommandType.Text;
oleDbCom.CommandText = accessAtr;
using (OleDbDataReader oleDbDR = oleDbCom.ExecuteReader())
{
if (oleDbDR.Read())
{
coNtext.Response.ContentType = "Image/JPEG";
coNtext.Response.Clear();
coNtext.Response.BufferOutput = true;
using (MemoryStream ms = new MemoryStream((byte[])oleDbDR[0]))
{
using (Bitmap bigPhoto = new Bitmap(ms))
{
using (Bitmap smallPhoto = new Bitmap(bigPhoto, Convert.ToInt32(bigPhoto.Width * 0.5),
Convert.ToInt32(bigPhoto.Height * 0.5)))
{
smallPhoto.Save(coNtext.Response.OutputStream, ImageFormat.Jpeg);
smallPhoto.Save(HttpCoNtext.Current.Server.MapPath("~/Photo/" + photoName));
}
}
}
}
}
}
}
}
catch
{
}
順便提一下,本人在使用 Visual Studio 2008 中的 AccessDataSource 時發現無法訪問 Access 2007 的資料庫.accdb格式的。
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()