php中上传图片到mysql数据库中

本文介绍了一个项目,其中将图片数据存储到MySQL数据库的BLOB类型字段中,而非传统地仅存储文件路径。详细过程包括创建数据库表、PHP上传文件的代码示例以及如何从数据库中读取和显示图片。文中还提到了$_FILES数组在PHP文件上传中的作用,以及MIME类型在处理多媒体数据时的重要性。
摘要由CSDN通过智能技术生成

这次做了一个小小的项目主要是将图片保存在数据库中,以前图片只是在数据库中报存图片在文件夹中的位置在用的时候再调用!!现在却不是太想用这方法。于是想把图片保存在数据库中,经过一段时间的努力终于发现原来mysql中有一种:bolb的类型!保存二进制文件!

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

 现将实例展示如下:

建立数据库:

CREATE TABLE ccs_image (
id int(4) unsigned NOT NULL auto_increment,
description varchar(250) default NULL,
bin_data longblob,
filename varchar(50) default NULL,
filesize varchar(50) default NULL,
filetype varchar(50) default NULL,
PRIMARY KEY (id)
)

接着是上传文件的页面,upload.php,code如下:

<HTML> 
<HEAD><TITLE>Store binary data into SQL Database</TITLE></HEAD> 
<BODY>

<?php 
if (isset($_POST['submit'])) {
$form_description = $_POST['form_description']; 
$form_data_name = $_FILES['form_data']['name']; 
$form_data_size = $_FILES['form_data']['size']; 
$form_data_type = $_FILES['form_data']['type'];
$form_data = $_FILES['form_data']['tmp_name'];

$connect = MYSQL_CONNECT( "localhost", "root", "") or die("Unable to connect to MySQL server"); 
mysql_select_db( "test") or die("Unable to select database");

$data = addslashes(fread(fopen($form_data, "r"), filesize($form_data)));

//echo "mysqlPicture=".$data;

$result=MYSQL_QUERY( "INSERT INTO ccs_image (description,bin_data,filename,filesize,filetype) VALUES ('$form_description','$data','$form_data_name','$form_data_size','$form_data_type')");

$id= mysql_insert_id(); 
print "

This file has the following Database ID: <a href='getdata.php?id=$id'>$id";

MYSQL_CLOSE();

} else {

?> 
<center>
<form method="post" action="http://localhost/temp/1018/upload.php" enctype="multipart/form-data"> 
File Description: 
<input type="text" name="form_description" size="40"> 
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000000"> <br> 
File to upload/store in database: 
<input type="file" name="form_data" size="40"> 

<input type="submit" name="submit" value="submit"> 
</form> 
</center>
<?php 

?> 
</BODY> 
</HTML>

 

  上文中的$_FILES['form_data']['name']; 等是获取刚上传来的文件的信息,php manual中有提到


注: 要确保文件上传表单的属性是 enctype="multipart/form-data",否则文件上传不了。

全局变量 $_FILES 自 PHP 4.1.0 起存在(在更早的版本中用 $HTTP_POST_FILES 替代)。此数组包含有所有上传的文件信息。

以上范例中 $_FILES 数组的内容如下所示。我们假设文件上传字段的名称如上例所示,为 userfile。名称可随意命名。


$_FILES['userfile']['name'] 
客户端机器文件的原名称。

$_FILES['userfile']['type'] 
文件的 MIME 类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值。

$_FILES['userfile']['size'] 
已上传文件的大小,单位为字节。

$_FILES['userfile']['tmp_name'] 
文件被上传后在服务端储存的临时文件名。

$_FILES['userfile']['error'] 
和该文件上传相关的错误代码。此项目是在 PHP 4.2.0 版本中增加的。

$data = addslashes(fread(fopen($form_data, "r"), filesize($form_data)));

默认情况下,PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

显示图片,getdata.php,code如下

<?php 
if(isset($_GET['id'])) { 
$id = $_GET['id'];
$connect = MYSQL_CONNECT( "localhost", "root", "") or die("Unable to connect to MySQL server"); 
mysql_select_db( "test") or die("Unable to select database");

$query = "select bin_data,filetype from ccs_image where id=$id"; 
$result = @MYSQL_QUERY($query);

$data = @MYSQL_RESULT($result,0, "bin_data"); 
$type = @MYSQL_RESULT($result,0, "filetype");

Header( "Content-type: $type"); 
echo $data; 

?>
 

这样就算完成了,但这样只是显示单张图片 
编写两个文件。其中,第一个文件作为HTML页面的模板,定位图片的显示位置。第二个文件则被用来从数据库中实际输出文件流,作为<IMG>标签的SRC属性。其实第二个文件就是getdata.php。第一个文件的代码如下: 
<HTML>
<BODY>
<?php 
$connect = MYSQL_CONNECT( "localhost", "root", "") or die("Unable to connect to MySQL server"); 
mysql_select_db( "test") or die("Unable to select database"); 
$result=mysql_query("SELECT * FROM ccs_image") or die("Can't Perform Query");
While ($row=mysql_fetch_array($result)){

$id=$row[id];
echo "<img src=/"show.php?id=".$id."/">winson<br>";
}
?>
</BODY>
</HTML>
 

最后提醒一点,header()函数使用前一定不能有任何输出,就算"<?php"前有个空格都不行

 

 

mime类型的意思(百度百科解释如下):

MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
 

 

  MIME的英文全称是"Multipurpose Internet Mail Extensions" 多功能Internet 邮件扩充服务,它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。
 

 

  MIME能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。这个标准被定义在; RFC 2045,; RFC 2046,; RFC 2047,; RFC 2048,; RFC 2049等RFC中。 由RFC 822转变而来的RFC 2822,规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此,一些非英语字符消息和二进制文件,图像,声音等非文字消息都不能在电子邮件中传输。MIME规定了用于表示各种各样的数据类型的符号化方法。
 

 

  浏览器接收到文件后,会进入插件系统进行查找,查找出哪种插件可以识别读取接收到的文件。如果浏览器不清楚调用哪种插件系统,它可能会告诉用户缺少某插件,或者直接选择某现有插件来试图读取接收到的文件,后者可能会导致系统的崩溃。传输的信息中缺少MIME标识可能导致的情况很难估计,因为某些计算机系统可能不会出现什么故障,但某些计算机可能就会因此而崩溃。 
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值