运用PDO存储将图片、音频文件存入数据库

在数据库中创建表格的时候,有一个字段为image,用来保存图片,那么其类型就是blob,关于blob,百度百科是这样描述的

BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。
但也有专家强调,这种处理大数据对象的方法是把双刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序处理BLOB的典型例子。
 
将图片或者音频等文件存入数据库的原理,特别好理解,因为它们是文件,那么就可以用函数读,然后将读出的内容保存在字符串中,然后再讲该字符串存到数据库中。
数据库如下:
1 create table pic(
2       id tinyint primary key auto_increment not null,
3       image blob not null
4 )engine=myisam charset=utf8;

 

创建一个提交文件的表单,注意,提交文件的表单(form的属性method="post"  enctype="multipart/form-data")

 1 <form action="" method="post" enctype="multipart/form-data">
 2     <input type="file" name="pic" >
 3     <input type="submit" name="submit">
 4 </form>
 5 
 6 <?php 
 7     if(!empty($_POST)){
 8         try {
 9             $pdo=new PDO("mysql:host=localhost;dbname=test","root","root");
10             $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
11             
12             $statement=$pdo->prepare("insert into pic values (:id,:image)");
13 
14             //开始读文件
15             $fp=fopen($_FILES['pic']['tmp_name'],"rb");
16             $content="";
17             $content=fread($fp,filesize($_FILES['pic']['tmp_name']));
18             fclose($fp);
19 
20             $statement->execute(["id"=>1,"image"=>$content]);
21             echo "the picture has been saved\n";
22         } catch (PDOException $e) {
23             echo "failed to save the picture";
24             echo $e->getMessage();
25         }
26      }
27 ?>

可以中途输出content的内容,或者运行完成后从数据库中查看添加的内容,然而你却看不懂内容是什么,全是乱码,但是,你成功将图片保存到了数据库。

接下来,你可以将数据库中的图片“数据”,读出来,然后再以图片的形式展示一下,看是不是已提交的那张图片,代码如下:

 1 <?php 
 2     try {
 3             $pdo=new PDO("mysql:host=localhost;dbname=test","root","root");
 4             $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
 5             $statement=$pdo->prepare("select * from pic");
 6             $statement->execute();
 7             list($id,$image)=$statement->fetch(PDO::FETCH_NUM);
 8             header("Content-Type:image/png");
 9             echo $image;
10         } catch (PDOException $e) {
11             echo "failed to open the picture";
12             echo $e->getMessage();
13         }
14 ?>

 

posted @ 2017-09-20 10:48  寻觅beyond  阅读(985)  评论(2编辑  收藏  举报
返回顶部