如何使用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)有了文件的名字,我们就可以用文件名来查找相关的文件了。

好了,这就是本文要讲的内容了。

参考文章:https://www.dreamincode.net/forums/blog/114/entry-3598-inserting-images-into-mysql-and-retrieving-them-using-php/

You may also like...

Leave a Reply

Your email address will not be published.