图片插入到数据库不是个好方法,如果你确实要存储图片到数据库的话,修改你的sql语句,不可以直接插入的.例如:
update person set p_image = LOAD_FILE('D:\incident1.jpg') where p_id = "asdsadssdsadfff";
建议把'D:\incident1.jpg'放在mysql的安装目录里面,避免权限问题...
解释:sql必须要有对 'D:\incident1.jpg'文件 和相应的路径 读权限,要不也不可以的. 另外检查LOAD_FILE 函数是否被禁用.这个函数是个危险的函数,很容易利用该函数对数据库攻击.
LOAD_FILE(file_name):
读取file_name文件 并以字符串形式返回,使用这个函数时,file_name必须存在于服务器上,而且是完整路径,sql要具有file_name的读取权限,还有该文件的size必须小于数据库 max_allowed_packet的值,否则读取的值为空.如果文件不存在或者sql没有读权限,那么该函数讲返回null
两种,一种是将图片转化成二进制数据流存入数据库中.一种是保存图片的路径,然后前台读取路径去调用图片.相关的代码百度一下应该会有,第二种方法实现上比较简单,就是存储路径,然后根据路径读取对应的图片显示出来.第一种就比较麻烦,要先把图片转化成二进制数据,读取时就是从数据库读取对应数据再转化成图片显示出来.
背景
所以一般来说存放这类信息,也就是存储他们的存放路径,至于文件本身存放在哪里,那这就不是数据库考虑的范畴了.数据库只关心怎么来的快,怎么来的小.
举例
拷贝 100 份这样的图片来测试
我们建三张表,分别用 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+)
①. row in set (0.00 sec)
+image_file+ longtext,
+image_file+ varchar(100) DEFAULT NULL,
我们来给三张表插入 100 张图片(插入前,建议把 max_allowed_packet 设置到最大)
tt_image1
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;
values (hex(load_file('/var/lib/mysql-files/$i.jpg')))";done;
('/var/lib/mysql-files/$i.jpg');";
done;aa=$aa'commit;';mysql -S /var/run/mysqld/mysqld.sock -e "+echo $aa+";
检查下三张表记录数
那么怎么把图片取出来呢?
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;
总结
这里我举了个用 MySQL 来存放图片的例子,看完小编介绍的c语言程序中主函数是_c语言程序由函数组成有以下三点:
占用磁盘空间大(这样会带来各种各样的功能与性能问题,比如备份,写入,读取操作等)
使用不易
还是推荐用文件路径来代替实际的文件内容存放
新建类型为mediumblob的字段【小图片可以用blob,更大的图片可以用LongBlob】
通常对用户上传的图片需要保存到数据库中.解决方法一般有两种:一种是将图片保存的路径存储到数据库;另一种是将图片以二进制数据流的形式直接写入数据库字段中.以下为具体方法:
第一段:保存图片的上传路径到数据库:
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();
//存入
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
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;
采用俩种方式可以根据实际需求灵活选择.
土嘎嘎的粉丝们大家好,很高兴回答你的问题.
一般有两种方式,
一种是将图片序列化后,将序列化的结果存入数据库中.使用时在读出进行反序列化.
另一种是将文件存放到一个位置,将存放的路径存入数据库.使用时按照路径获取图片.
以上就是土嘎嘎小编为大家整理的图片怎么存在mysql里相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!