數(shù)據(jù)庫如何存取圖片?
網(wǎng)友解答: 數(shù)據(jù)庫存圖片的方式以下兩種:在數(shù)據(jù)庫中存儲圖片文件的文件名或存儲路徑(本地路徑或者網(wǎng)絡路徑)這是最常用的方式,即是將圖片的存儲的完整路徑或文件名以字符串的方式存入到數(shù)據(jù)庫中,
數(shù)據(jù)庫存圖片的方式以下兩種:
在數(shù)據(jù)庫中存儲圖片文件的文件名或存儲路徑(本地路徑或者網(wǎng)絡路徑)這是最常用的方式,即是將圖片的存儲的完整路徑或文件名以字符串的方式存入到數(shù)據(jù)庫中,讀取效率高、而且便于維護。實現(xiàn)的方法也比較簡單,拿最常見的使用場景來說吧,比如用戶注冊時,需要他上傳了一張照片,常見做法就是使用文件控件FileUpload讓用戶選擇電腦的上面的圖片,然后將其選擇的圖片所在的路徑及文件名獲取,將文件上傳后同時將文件名保存到數(shù)據(jù)庫對應的表中,顯示圖片時只需要從數(shù)據(jù)庫中獲取文件名并構造完整路徑即可。
ASP.NET
代碼如下://獲取FileUpload控件選取圖片后的文件路徑
strng filepath=FileUpload1.PostedFile.FileName;
//獲取圖片文件名,即從圖片路徑字符串中獲取最后的那段
string filename=filepath.Substring(filepath.LastIndexOf("")+1);
//然后執(zhí)行文件上傳,將文件保存到服務器指定的目錄,如在程序目錄下建立一個PIC文件夾保存文件
FileUpload1.PostedFile.SaveAs(Server.MapPath("PIC/")+filename);
上傳成功后,將文件名filename字符串插入數(shù)據(jù)庫即可。
顯示時將filename從數(shù)據(jù)取出,用Image1.ImageUrl="PIC/"+filename 顯示。
將圖片文件轉為二進制文件流保存到數(shù)據(jù)庫,顯示時再二進制轉為文件這種方式很少用,因為圖片包含的信息比較多,轉為二進制后存儲的內容大,占用空間,而且需要轉換,費時好資源。
保存圖片的 核心代碼如下:
//文件路徑
string picturePath = @"D:1.jpg";
//創(chuàng)建FileStream對象
FileStream fs = new FileStream(picturePath, FileMode.Open, FileAccess.Read);
//聲明Byte數(shù)組
Byte[] mybyte = new byte[fs.Length];
//讀取數(shù)據(jù)
fs.Read(mybyte, 0, mybyte.Length);
fs.Close();
//轉換成二進制數(shù)據(jù) mybyte 保存到數(shù)據(jù)庫
SqlParameter prm = new SqlParameter
("@blobdata", SqlDbType.VarBinary, mybyte.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, mybyte);
command.Parameters.Add(prm);
//打開數(shù)據(jù)庫連接
connection.Open();
command.ExecuteNonQuery();
connection.Close();
讀取圖片的核心代碼如下:
//打開數(shù)據(jù)庫連接
connection.Open();
//創(chuàng)建SQL語句
string sql = "select BLODID,BLOBData from Images order by BLODID";
//創(chuàng)建SqlCommand對象
SqlCommand command = new SqlCommand(sql, connection);
//創(chuàng)建DataAdapter對象
SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
//創(chuàng)建DataSet對象
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet, "BLOBTest");
int c = dataSet.Tables["BLOBTest"].Rows.Count;
if (c 0)
{
Byte[] mybyte = new byte[0];
mybyte = (Byte[])(dataSet.Tables["BLOBTest"].Rows[c - 1]["BLOBData"]);
MemoryStream ms = new MemoryStream(mybyte);
//顯示圖片
pictureBox1.Image = Image.FromStream(ms);
}
connection.Close();
網(wǎng)友解答:這涉及到字段類型的問題,如果使用二進制類型的字段就可以存放圖片字段了!
我想題主要問的是如何將圖片寫入到數(shù)據(jù)庫吧,這確實是個問題,文件是流,那寫入也得使用流了,這就要求數(shù)據(jù)庫驅動提供流寫入方式了,還好大多驅動都實現(xiàn)了方法,比如JDBC,ODBC等,實在太多了,不過某些框架不提供功能!