本文目錄一覽:
- 1、如何將圖片儲存在MySQL數據庫里
- 2、如何把MYD,MYI文件導入到MYSQL數據庫中
- 3、如何把文件傳入mysql中的blob字段中
- 4、如何把文件存放在mysql數據庫中
- 5、如何將後綴為.frm,opt,myi,myd的mysql數據文件導入到mysql數據庫中
- 6、學習怎樣把視頻文件存儲到mysql數據庫
如何將圖片儲存在MySQL數據庫里
通常對用戶上傳的圖片需要保存到數據庫中。解決方法一般有兩種:一種是將圖片保存的路徑存儲到數據庫;另一種是將圖片以二進制數據流的形式直接寫入數據庫字段中。以下為具體方法:
一、保存圖片的上傳路徑到數據庫:
string uppath=””;//用於保存圖片上傳路徑
//獲取上傳圖片的文件名
string fileFullname = this.FileUpload1.FileName;
//獲取圖片上傳的時間,以時間作為圖片的名字可以防止圖片重名
string dataName = DateTime.Now.ToString(“yyyyMMddhhmmss”);
//獲取圖片的文件名(不含擴展名)
string fileName = fileFullname.Substring(fileFullname.LastIndexOf(“\\”) + 1);
//獲取圖片擴展名
string type = fileFullname.Substring(fileFullname.LastIndexOf(“.”) + 1);
//判斷是否為要求的格式
if (type == “bmp” || type == “jpg” || type == “jpeg” || type == “gif” || type == “JPG” || type == “JPEG” || type == “BMP” || type == “GIF”)
{
//將圖片上傳到指定路徑的文件夾
this.FileUpload1.SaveAs(Server.MapPath(“~/upload”) + “\\” + dataName + “.” + type);
//將路徑保存到變量,將該變量的值保存到數據庫相應字段即可
uppath = “~/upload/” + dataName + “.” + type;
}
二、將圖片以二進制數據流直接保存到數據庫:
引用如下命名空間:
using System.Drawing;
using System.IO;
using System.Data.SqlClient;
設計數據庫時,表中相應的字段類型為iamge
保存:
//圖片路徑
string strPath = this.FileUpload1.PostedFile.FileName.ToString ();
//讀取圖片
FileStream fs = new System.IO.FileStream(strPath, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
byte[] photo = br.ReadBytes((int)fs.Length);
br.Close();
fs.Close();
//存入
SqlConnection myConn = new SqlConnection(“Data Source=.;Initial Catalog=stumanage;User ID=sa;Password=123”);
string strComm = ” INSERT INTO stuInfo(stuid,stuimage) VALUES(107,@photoBinary )”;//操作數據庫語句根據需要修改
SqlCommand myComm = new SqlCommand(strComm, myConn);
myComm.Parameters.Add(“@photoBinary”, SqlDbType.Binary, photo.Length);
myComm.Parameters[“@photoBinary”].Value = photo;
myConn.Open();
if (myComm.ExecuteNonQuery() 0)
{
this.Label1.Text = “ok”;
}
myConn.Close();
讀取:
…連接數據庫字符串省略
mycon.Open();
SqlCommand command = new
SqlCommand(“select stuimage from stuInfo where stuid=107”, mycon);//查詢語句根據需要修改
byte[] image = (byte[])command.ExecuteScalar ();
//指定從數據庫讀取出來的圖片的保存路徑及名字
string strPath = “~/Upload/zhangsan.JPG”;
string strPhotoPath = Server.MapPath(strPath);
//按上面的路徑與名字保存圖片文件
BinaryWriter bw = new BinaryWriter(File.Open(strPhotoPath,FileMode.OpenOrCreate));
bw.Write(image);
bw.Close();
//顯示圖片
this.Image1.ImageUrl = strPath;
採用倆種方式可以根據實際需求靈活選擇。
如何把MYD,MYI文件導入到MYSQL數據庫中
frm,myd,myi是屬於MySQL存儲數據的文件,phpMyAdmin是無法導入的。
phpMyAdmin支持的文件格式為sql文件。
其實很簡單:
1.找到你的mysql的安裝目錄下的data文件夾,新建一個文件夾,文件夾的名稱是你想設計的庫的名稱,把這些文件放到此文件夾中。2.
frm格式 MYD格式MYI格式的文件是mysql用來存放表的文件,所以只能放到mysql的安裝目錄的data目錄下
而且如果你是要傳到空間上的話,基本上是無法恢復了,除非你把這些數據給空間商要他幫你恢復。
如何把文件傳入mysql中的blob字段中
1、用戶上傳文檔後,把文檔存儲到某個路徑下,然後在數據庫中存儲這個路徑和文檔名
2、用戶上傳文檔後,進行二進制讀取(流處理),然後把讀取出來的二進制存儲到數據庫中
首先我們要進行讀取文件
$myfile = fopen(“webdictionary.txt”, “r”) or die(“Unable to open file!”);
然後把 $myfile 存儲到mysql中
sql =”insert into table_name (fn) values($myfile)””
這樣就把文檔轉變成二進制之後,存儲到了mysql數據庫,下次取出時,只需要把取出的數據存儲到一個文檔中
如何把文件存放在mysql數據庫中
1、mysql如果使用myisam存儲引擎,數據庫文件類型就包括.frm、.myd、.myi,默認存放位置是c:\documents
and
settings\all
users\application
data\mysql\mysql
server
5.1\data
2、mysql如果使用innodb存儲引擎,mysql數據庫文件類型就包括.frm、ibdata1、.ibd,存放位置有兩個,
.frm文件默認存放位置是c:\documents
and
settings\all
users\application
data\mysql\mysql
server
5.1\data,
ibdata1、.ibd文件默認存放位置是mysql安裝目錄下的data文件夾
如何將後綴為.frm,opt,myi,myd的mysql數據文件導入到mysql數據庫中
在你的MYSQL的
數據文件夾
下(往往可能是MYSQL安裝文件夾的DATA下)新建立一個文件夾作為數據庫名,然後把這些文件拷貝到那個數據庫文件夾下就可以了。
MYSQL裡面使用MYISAM數據引擎的情況下,DATA文件夾下一個數據庫就是一個文件夾,例如你建立了文件夾DATA\abc,就表示有一個叫做abc的數據庫。
一個表對應三個文件,你上面的文件拷貝到DATA\abc下,就有了admin、bbs_main、bbs_ref幾個表。
學習怎樣把視頻文件存儲到mysql數據庫
背景
MySQL 一直以來都有 TEXT、BLOB 等類型用來存儲圖片、視頻等大對象信息。比如一張圖片,隨便一張都 5M 以上。視頻也是,隨便一部視頻就是 2G 以上。
假設用 MySQL 來存放電影視頻等信息,一部是 2G,那麼存儲 1000 部就是 2TB,2TB 也就是 1000 條記錄而已,但是對數據庫性能來說,不僅僅是看記錄數量,更主要的還得看佔用磁盤空間大小。空間大了,所有以前的經驗啥的都失效了。
所以一般來說存放這類信息,也就是存儲他們的存放路徑,至於文件本身存放在哪裡,那這就不是數據庫考慮的範疇了。數據庫只關心怎麼來的快,怎麼來的小。
舉例
雖然不推薦 MySQL 這樣做,但是也得知道 MySQL 該怎麼做才行,做到心裡有數。比如下面一張微信圖片,大概 5M 的樣子。
root@ytt:/var/lib/mysql-files# ls -sihl 微信圖片_20190711095019.jpg274501 5.4M -rw-r–r– 1 root root 5.4M Jul 11 07:17 微信圖片_20190711095019.jpg
拷貝 100 份這樣的圖片來測試
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`; do cp 微信圖片_20190711095019.jpg “$i”.jpg;done;
root@ytt:/var/lib/mysql-files# ls
100.jpg 17.jpg 25.jpg 33.jpg 41.jpg 4.jpg 58.jpg 66.jpg 74.jpg 82.jpg 90.jpg 99.jpg f8.tsv
10.jpg 18.jpg 26.jpg 34.jpg 42.jpg 50.jpg 59.jpg 67.jpg 75.jpg 83.jpg 91.jpg 9.jpg 微信圖片_20190711095019.jpg
1111.jpg 19.jpg 27.jpg 35.jpg 43.jpg 51.jpg 5.jpg 68.jpg 76.jpg 84.jpg 92.jpg f1.tsv
11.jpg 1.jpg 28.jpg 36.jpg 44.jpg 52.jpg 60.jpg 69.jpg 77.jpg 85.jpg 93.jpg f2.tsv
12.jpg 20.jpg 29.jpg 37.jpg 45.jpg 53.jpg 61.jpg 6.jpg 78.jpg 86.jpg 94.jpg f3.tsv
13.jpg 21.jpg 2.jpg 38.jpg 46.jpg 54.jpg 62.jpg 70.jpg 79.jpg 87.jpg 95.jpg f4.tsv
14.jpg 22.jpg 30.jpg 39.jpg 47.jpg 55.jpg 63.jpg 71.jpg 7.jpg 88.jpg 96.jpg f5.tsv
15.jpg 23.jpg 31.jpg 3.jpg 48.jpg 56.jpg 64.jpg 72.jpg 80.jpg 89.jpg 97.jpg f6.tsv
16.jpg 24.jpg 32.jpg 40.jpg 49.jpg 57.jpg 65.jpg 73.jpg 81.jpg 8.jpg 98.jpg f7.tsv
我們建三張表,分別用 LONGBLOB、LONGTEXT 和 VARCHAR 來存儲這些圖片信息
mysql show create table tt_image1G
*************************** 1. row ***************************
Table: tt_image1
Create Table: CREATE TABLE `tt_image1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image_file` longblob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql show create table tt_image2G
*************************** 1. row ***************************
Table: tt_image2
Create Table: CREATE TABLE `tt_image2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image_file` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql show create table tt_image3G
*************************** 1. row ***************************
Table: tt_image3
Create Table: CREATE TABLE `tt_image3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image_file` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
我們來給三張表插入 100 張圖片(插入前,建議把 max_allowed_packet 設置到最大)
tt_image1
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`;
do mysql -S /var/run/mysqld/mysqld.sock -e “insert into ytt.tt_image1(image_file)
values (load_file(‘/var/lib/mysql-files/$i.jpg’))”;done;
tt_image2
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`;
do mysql -S /var/run/mysqld/mysqld.sock -e “insert into ytt.tt_image2(image_file)
values (hex(load_file(‘/var/lib/mysql-files/$i.jpg’)))”;done;
tt_image3
root@ytt:/var/lib/mysql-files# aa=’begin;’;for i in `seq 1 100`;
do aa=$aa”insert into ytt.tt_image3(image_file) values
(‘/var/lib/mysql-files/$i.jpg’);”;
done;aa=$aa’commit;’;mysql -S /var/run/mysqld/mysqld.sock -e “`echo $aa`”;
檢查下三張表記錄數
mysql select ‘tt_image1’ as name ,count(*) from tt_image1 union allselect ‘tt_image2’,count(*) from tt_image2 union all select ‘tt_image3’, count(*) from tt_image3;+———–+———-+| name | count(*) |+———–+———-+| tt_image1 | 100 || tt_image2 | 100 || tt_image3 | 100 |+———–+———-+3 rows in set (0.00 sec)
看下文件大小,可以看到實際大小排名,LONGTEXT 字段存儲的最大,LONGBLOB 字段縮小到一半,最小的是存儲圖片路徑的表 tt_image3。所以這裡從存儲空間來看,存放路徑最佔優勢。
root@ytt:/var/lib/mysql/ytt# ls -silhS tt_image*274603 1.1G -rw-r—– 1 mysql mysql 1.1G Jul 11 07:27 tt_image2.ibd274602 545M -rw-r—– 1 mysql mysql 544M Jul 11 07:26 tt_image1.ibd274605 80K -rw-r—– 1 mysql mysql 112K Jul 11 07:27 tt_image3.ibd
那麼怎麼把圖片取出來呢?
tt_image3 肯定是最容易的
mysql select * from tt_image3;+—-+—————————-+| id | image_file |+—-+—————————-+| 1 | /var/lib/mysql-files/1.jpg |+—-+—————————-+…100 rows in set (0.00 sec)
tt_image1 直接導出來二進制文件即可,下面我寫了個存儲過程,導出所有圖片。
mysql DELIMITER $$mysql USE `ytt`$$mysql DROP PROCEDURE IF EXISTS `sp_get_image`$$mysql CREATE DEFINER=`ytt`@`localhost` PROCEDURE `sp_get_image`()mysql BEGIN DECLARE i,cnt INT DEFAULT 0; SELECT COUNT(*) FROM tt_image1 WHERE 1 INTO cnt; WHILE i cnt DO SET @stmt = CONCAT(‘select image_file from tt_image1 limit ‘,i,’,1 into dumpfile ”/var/lib/mysql-files/image’,i,’.jpg”’); PREPARE s1 FROM @stmt; EXECUTE s1; DROP PREPARE s1; SET i = i + 1; END WHILE; END$$mysql DELIMITER ;mysql call sp_get_image;
tt_image2 類似,把 select 語句里 image_file 變為 unhex(image_file) 即可。
總結
這裡我舉了個用 MySQL 來存放圖片的例子,總的來說有以下三點:
佔用磁盤空間大(這樣會帶來各種各樣的功能與性能問題,比如備份,寫入,讀取操作等)
使用不易
還是推薦用文件路徑來代替實際的文件內容存放
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/205806.html