如何使用MySQL保存一个图片并且用PHP得到它
首先,我要说的是把一个图片保存在MySQL中,再读出来是一个很不推荐的做法。我们只是看看假如真的要这样做,该如何做,最后我会和大家聊聊一般我们如何处理这种使用情况,以及不推荐这样做的原因。
首先图片是一个BLOB(Binary Large Object)是可以用来存储二进制的数据。这就是用来保存图片,文件等等的数据。因为这种object通常都很大,所以我们需要定义一个很大的域来保存信息。如何通过PHP来插入呢,其实很简单:
1)读取图片成二进制
2)准备插入到数据库
3)使用SQL语句插入相关数据到数据库
下面我们来看看简单的PHP代码:
// Image submitted by form. Open it for reading (mode "r") $fp = fopen($_FILES['file_name']['tmp_name'], "r"); // If successful, read from the file pointer using the size of the file (in bytes) as the length. if ($fp) { $content = fread($fp, $_FILES['file_name']['size']); fclose($fp); // Add slashes to the content so that it will escape special characters. // As pointed out, mysql_real_escape_string can be used here as well. Your choice. $content = addslashes($content); // Insert into the table "table" for column "image" with our binary string of data ("content") mysql_query("Insert into table (image) Values('$content')"); }
这里我们使用了fread()来把图片读取成比特,有了相关比特数据之后,就是简单地把它插入到BLOB的列就可以了。我们例子中image列是一个BLOB的数据类型。需要注意的是你选择的BLOB的列大小需要能够保存相应图片的大小,因为MySQL还是有不同大小的BLOB数据类型的。
下面我们来看一下如何获取图片数据,同样需要三个步骤:
1)设置content的type到图片的类型
2)找到图片,并且把它从数据库中拿出来
3)显示图片
相关的代码如下:
// Read the row we want to pull out of the database. $result = mysql_query("select image from table where id = 1"); // If successful, fetch the row as an array and store the data from the "image" column into a variable. if ($result) { if ($row = mysql_fetch_array($result)) { $img = $row["image"]; } } // Set the content type of this page to image/jpeg since the image we are pulling out is a jpg image. header("Content-type: image/jpeg"); // Echo out the image. echo "$img";
我们把数据从image列中拿出来,并且保存在一个变量中,然后我们设置相关content-type为image/jpeg就可以了,然后就可以显示相关的内容了。
需要注意的是不要再header()调用之前打印任何部分,否则在调用header的时候会报错”Headers already sent”。
其实说白了,这个和别的BLOB得数据的插入读取是一样的,并没有任何差别。
下面我们来谈谈为什么不要把图片保存到数据库中呢?因为数据库一般为了查询的方便会进行分页,而一些大的数据则会导致查询变得很慢,所以我们还是不要这样做为好。
那么推荐的做法是什么呢?我们一般会存储相关文件的路径就可以了。当想要找相关文件的时候,只要找到相关的路径就可以了,然后再根据相关的路径去磁盘找到需要显示的文件就可以了。这样做有两个好处:1)这样数据库的数据就很小了。 2)有了文件的名字,我们就可以用文件名来查找相关的文件了。
好了,这就是本文要讲的内容了。
Recent Comments