回覆列表
-
1 # 慧鳥先飛
-
2 # 資料指揮
這涉及到欄位型別的問題,如果使用二進位制型別的欄位就可以存放圖片欄位了!
我想題主要問的是如何將圖片寫入到資料庫吧,這確實是個問題,檔案是流,那寫入也得使用流了,這就要求資料庫驅動提供流寫入方式了,還好大多驅動都實現了方法,比如JDBC,ODBC等,實在太多了,不過某些框架不提供功能!
-
3 # 網路圈
對於一款系統而言,難免會涉及到使用者上傳的圖片資料,為了保證資料落地我們需要把圖片資訊存入在資料庫中,解決方案主要有以下兩種:
1、將圖片路徑存入資料庫中
這種做法是我們推薦的,因為資料資料一般較多較大,為便於存取我們一般將圖片上傳到伺服器的某個目錄中,然後將其引用路徑儲存到資料庫中。這樣一來,某條記錄展示時就能找到與之對應的圖片路徑,然後載入引用即可。
2、將圖片以二進位制資料流形式寫入資料庫欄位中
這種做法並不推薦,因為效能較低、佔用儲存空間較大,不利於資料庫最佳化。具體做法是:圖片上傳時讀取此圖的二進位制資料,然後存入資料庫欄位中,這裡對資料庫欄位型別也是有一定要求的,比如說:MySQL中欄位選BLOB型別、SQL Server中選image型別。
將圖片二進位制資料存入資料庫後,如果要顯示圖片則需要從資料庫中查詢獲取到二進位制資料,然後前端讀取base64二進位制字串,說實話這種形式不夠優雅。
-
4 # 信管學堂
資料庫內部儲存圖片記憶體消耗太大,而且速度很慢,一般在開發的時候報圖片單獨放在一個images資料夾裡,在資料庫裡存放圖片的儲存路徑,當開發的時候訪問資料庫時就可以把圖片加載出來。
資料庫存圖片的方式以下兩種:
在資料庫中儲存圖片檔案的檔名或儲存路徑(本地路徑或者網路路徑)這是最常用的方式,即是將圖片的儲存的完整路徑或檔名以字串的方式存入到資料庫中,讀取效率高、而且便於維護。實現的方法也比較簡單,拿最常見的使用場景來說吧,比如使用者註冊時,需要他上傳了一張照片,常見做法就是使用檔案控制元件FileUpload讓使用者選擇電腦的上面的圖片,然後將其選擇的圖片所在的路徑及檔名獲取,將檔案上傳後同時將檔名儲存到資料庫對應的表中,顯示圖片時只需要從資料庫中獲取檔名並構造完整路徑即可。
ASP.NET
程式碼如下://獲取FileUpload控制元件選取圖片後的檔案路徑
strng filepath=FileUpload1.PostedFile.FileName;
//獲取圖片檔名,即從圖片路徑字串中獲取最後\\的那段
string filename=filepath.Substring(filepath.LastIndexOf("\\")+1);
//然後執行檔案上傳,將檔案儲存到伺服器指定的目錄,如在程式目錄下建立一個PIC資料夾儲存檔案
FileUpload1.PostedFile.SaveAs(Server.MapPath("PIC/")+filename);
上傳成功後,將檔名filename字串插入資料庫即可。
顯示時將filename從資料取出,用Image1.ImageUrl="PIC/"+filename 顯示。
將圖片檔案轉為二進位制檔案流儲存到資料庫,顯示時再二進位制轉為檔案這種方式很少用,因為圖片包含的資訊比較多,轉為二進位制後儲存的內容大,佔用空間,而且需要轉換,費時好資源。
儲存圖片的 核心程式碼如下:
//檔案路徑
string picturePath = @"D:\1.jpg";
//建立FileStream物件
FileStream fs = new FileStream(picturePath, FileMode.Open, FileAccess.Read);
//宣告Byte陣列
Byte[] mybyte = new byte[fs.Length];
//讀取資料
fs.Read(mybyte, 0, mybyte.Length);
fs.Close();
//轉換成二進位制資料 mybyte 儲存到資料庫
SqlParameter prm = new SqlParameter
("@blobdata", SqlDbType.VarBinary, mybyte.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, mybyte);
command.Parameters.Add(prm);
//開啟資料庫連線
connection.Open();
command.ExecuteNonQuery();
connection.Close();
讀取圖片的核心程式碼如下:
//開啟資料庫連線
connection.Open();
//建立SQL語句
string sql = "select BLODID,BLOBData from Images order by BLODID";
//建立SqlCommand物件
SqlCommand command = new SqlCommand(sql, connection);
//建立DataAdapter物件
SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
//建立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();