用PHP和MySQL保存和输出图片


Posted in PHP onOctober 09, 2006

设置数据库

我们通常在数据库中所使用的文本或整数类型的字段和需要用来保存图片的字段的不同之处就在于两者所需要保存的数据量不同。MySQL数据库使用专门的字段来保存大容量的数据,数据类型为BLOB。

MySQL数据库为BLOB做出的定义如下:BLOB数据类型是一种大型的二进制对象,可以保存可变数量的数据。BLOB具有四种类型,分别是TINYBLOB,BLOB, MEDIUMBLOB 和LONGBLOB,区别在于各自所能够保存的最大数据长度不同。

在介绍了所需要使用的数据类型之后,我们可以使用以下语句创建保存图象的数据表。

CREATE TABLE Images ( PicNum int NOT NULL AUTO_INCREMENT PRIMARY KEY, Image BLOB );
编写上传脚本

关于如何实现文件的上传,我们在这里就不再介绍了,感兴趣的读者可以参见“网页陶吧”内的相关文章。现在,我们主要来看一下如何接收上传文件并将其存入到MySQL数据库中。具体的脚本代码如下,其中我们假定文件上传域的名称为Picture。
<?
If($Picture != "none") {
$PSize = filesize($Picture);
$mysqlPicture = addslashes(fread(fopen($Picture, "r"), $PSize));
mysql_connect($host,$username,$password) or die("Unable to connect to SQL server");
@mysql_select_db($db) or die("Unable to select database");
mysql_query("INSERT INTO Images (Image) VALUES ($mysqlPicture)") or die("Cant Perform Query");
}else {
echo"You did not upload any picture";
}
?>

这样,我们就可以成功的把图片保存到数据库中。如果在将图片插入MySQL的过程中出现问题,可以检查一下MySQL数据库所允许的最大数据包的大小。如果设置值过小的话,我们会在数据库的错误日志中找到相应的记录。

下面,我们简单说明一下上述脚本程序。首先,我们通过“If($Picture != "none")”检查是否有文件被上传。然后,使用addslashes()函数避免出现数据格式错误。最后,连接MySQL,选择数据库并插入图片。
显示图片

在知道了如何将图? 入数据库之后,我们就需要考虑怎样才能从数据库中取出图片并在HTML页面中显示出来。这个过程要稍微复杂一些,下面我们就来介绍一下实现过程。
因为PHP显示图片需要发送相应的标头,所以我们就会面临这样一个问题,那就是一次只能显示一副图片,因为我们无法在发出标头之后再发送其它的标头。
为了有效的解决这一问题,我们编写了两个文件。其中,第一个文件作为HTML页面的模板,定位图片的显示位置。第二个文件则被用来从数据库中实际输出文件流,作为<IMG>标签的SRC属性。
第一个文件的简单形式可以如下:
<HTML> <BODY>
<?
mysql_connect($host,$username,$password) or die("Unable to connect to SQL server");
@mysql_select_db($db) or die("Unable to select database");
$result=mysql_query("SELECT * FROM Images") or die("Cant Perform Query");
While($row=mysql_fetch_object($result)) {
echo "<IMG SRC=\"Second.php3? PicNum=$row->PicNum\">";
} ?>
</BODY> </HTML>

当HTML页面被浏览时,每显示一副图片就会调用一次Second.php3文件。当第二个文件被调用时会传入相应的Picture ID,我们可以借此从数据库中取回对应的图片并显示。
Second.php3文件如下:
<?
$result=mysql_query("SELECT * FROM Images WHERE PicNum=$PicNum") or die("Cant perform Query");
$row=mysql_fetch_object($result);
Header( "Content-type: image/gif");
echo $row->Image;
?>

到此,我们就介绍完了使用PHP和MySQL保存和显示图片的全过程。文中所举得都是一些最简单的实例,读者可以根据自己的实际需要加入其它一些功能,使整个程序更加完善。 

PHP 相关文章推荐
用PHP和ACCESS写聊天室(九)
Oct 09 PHP
中英文字符串翻转函数
Dec 09 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
Dec 30 PHP
探讨php中防止SQL注入最好的方法是什么
Jun 10 PHP
将二维数组转为一维数组的2种方法
May 26 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
Jul 28 PHP
php判断并删除空目录及空子目录的方法
Feb 11 PHP
如何离线执行php任务
Feb 21 PHP
laravel中命名路由的使用方法
Feb 24 PHP
PHP微信模板消息操作示例
Jun 29 PHP
PHP删除数组中特定元素的两种方法
Feb 28 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
Aug 06 PHP
PHP生成带有雪花背景的验证码
Oct 09 #PHP
一个可查询所有表的“通用”查询分页类
Oct 09 #PHP
Get或Post提交值的非法数据处理
Oct 09 #PHP
用Socket发送电子邮件
Oct 09 #PHP
编写自己的php扩展函数
Oct 09 #PHP
PHP输出控制功能在简繁体转换中的应用
Oct 09 #PHP
PHP 中执行系统外部命令
Oct 09 #PHP
You might like
法国:浪漫之都的咖啡文化
2021/03/03 咖啡文化
SMARTY学习手记
2007/01/04 PHP
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
PHP 程序授权验证开发思路
2009/07/09 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
jQuery下通过$.browser来判断浏览器.
2011/04/05 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
JS实现头条新闻的经典轮播图效果示例
2019/01/30 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
[02:43]2018DOTA2亚洲邀请赛主赛事首日TOP5
2018/04/04 DOTA
Python栈类实例分析
2015/06/15 Python
Python提取频域特征知识点浅析
2019/03/04 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
pycharm sciview的图片另存为操作
2020/06/01 Python
Python-for循环的内部机制
2020/06/12 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
python实现canny边缘检测
2020/09/14 Python
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
服装设计专业毕业生推荐信
2013/11/09 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
护理医院见习报告
2014/11/03 职场文书
民间借贷纠纷案件代理词
2015/05/26 职场文书
因个人工作失误检讨书
2019/06/21 职场文书
asyncio异步编程之Task对象详解
2022/03/13 Python
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android