7.5.4 插入和显示数据库中的图片(处理二进制数据)
数据库应用程序,特别是基于Web的数据库应用程序,常常会涉及到图片信息的存储和显示。通常我们使用的方法是将所要显示的图片存在特定的目录下,在数据库中保存相应的图片的名称,然后在PHP中查询数据库获得文件路径并在HTML文件中引用。
但是,如果我们想动态的显示图片,上述方法就不能满足需要了。因此必须把图片存入数据库,然后通过编程动态地显示我们需要的图片。
在实际操作中,可以利用PHP将图片插入到数据库中,在数据库中,图片是以二进制格式存储的。随后你也可以使用PHP将图片数据读出来并显示在网页上。
使用HTML表单可以将客户端的图片文件作为请求传递给服务端,PHP可以读取请求中的上载文件数据,并将数据保存在数据库中。
1.将图片插入数据库
下面我们就来看一个范例,了解怎样使用表单提交图片文件,并保存到数据库中。这个范例有两个文件组成。
upload.htm
这个网页包含一个表单,用于提交图片文件,它的代码如下:
代码清单7-6
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>提交表单</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> </head>
<body> <form action="insertPic.php" method="post" enctype=" multipart/form-data" name="mainForm" id="mainForm"> <input type="file" name="myFile" /> <br /> <input type="submit" name="Submit" value="Submit"/> </form> </body> </html>
|
保存到Web根目录下,在浏览器中请求,可以看到如图7-33所示的效果:
|
图7-33 文件上传表单 |
insertPic.php
这个文件用来将提交的文件数据保存到数据库中,代码如下:
代码清单7-7
<?php //由于上传过来的图片被保存在一个临时文件中,所以 //我们仅需要读取该文件就可以获取传过来的图片 $fp = fopen($_FILES["myFile"]["tmp_name"],"rb"); $buf = addslashes(fread($fp,$_FILES["myFile"]["size"])); //创建一个PDO对象 $dbh = new PDO("mysql:host=localhost;port= 3306;dbname=myDatabase", "root", "verysecret"); //执行插入操作并将结果保存在一个变量中 $result = $dbh->query("INSERT INTO employees (firstName,lastName,EmpType,age,picture) VALUES ('myFirst','myLast','myEmpType',50,'$buf')"); //获取影响的行数 if ($result->rowCount() >0) { echo("数据已插入。"); } else { echo("不能执行插入操作。"); } //显式的关闭PDO连接 $dbh = NULL; ?>
|
将这个文件也保存到Web根目录下。
测试
现在我们可以测试一下功能,在图7-33中显示的网页上,我们使用"浏览"按钮选择一个图片文件,然后单击"Submit"按钮,这就会打开insertPic.php文件执行,如果中间没有出错,那么就算执行成功了。
关于insertPic.php文件的基本工作原理我们现在是清楚的,但是对于如何分离出提交表单中的文件数据可能还不清楚,不过没关系,我们将在后面的章节再详细介绍如何处理文件上载。
2.显示数据库中的图片数据
在将图片保存到数据库中后,我们就可以读取它并显示出来,也可以将它保存为文件。下面我们就来看怎样显示数据库中保存的图片数据。
我们新建一个PHP文件,命名为showPic.php,编写代码如下:
代码清单7-8
<?php //创建一个PDO对象 $dbh = new PDO("mysql:host=localhost;port=3306; dbname=myDatabase", "root", "verysecret"); //设置字符编码 $dbh->exec("SET CHARACTER SET gb2312"); //执行查询并将结果保存在一个变量中 $result = $dbh->query("SELECT * FROM employees WHERE firstName = 'myFirst'"); //获取第一行数据 $row = $result->fetch(); //写出数据记录,首先查看是否存在记录 if(!empty($row)){ header("Content-type: image/JPEG",true); echo($row["picture"]); } //显式的关闭PDO连接 $dbh = NULL; ?>
|
将这个文件也保存到Web根目录下,然后在浏览器中请求,就会得到如图7-34所示的效果(图中显示的图片是我们提交的图片):
|
图7-34 显示数据库中的图片数据
http://book.51cto.com/art/200809/89421.htm
|