如何使用PHP存储和检索来自MySQL数据库的图像?
我怎样才能在MySQL中插入图像,然后使用PHP检索它?
我在这两个领域的经验都是有限的,我可以用一些代码让我开始研究这个问题。
首先你创build一个MySQL表来存储图像,例如:
create table testblob ( image_id tinyint(3) not null default '0', image_type varchar(25) not null default '', image blob not null, image_size varchar(25) not null default '', image_ctgy varchar(25) not null default '', image_name varchar(50) not null default '' );
然后你可以写一个图像到数据库,如:
/*** * All of the below MySQL_ commands can be easily * translated to MySQLi_ with the additions as commented ***/ $imgData = file_get_contents($filename); $size = getimagesize($filename); mysql_connect("localhost", "$username", "$password"); mysql_select_db ("$dbname"); // mysqli // $link = mysqli_connect("localhost", $username, $password,$dbname); $sql = sprintf("INSERT INTO testblob (image_type, image, image_size, image_name) VALUES ('%s', '%s', '%d', '%s')", /*** * For all mysqli_ functions below, the syntax is: * mysqli_whartever($link, $functionContents); ***/ mysql_real_escape_string($size['mime']), mysql_real_escape_string($imgData), $size[3], mysql_real_escape_string($_FILES['userfile']['name']) ); mysql_query($sql);
您可以使用以下方式在网页中显示来自数据库的图像:
$link = mysql_connect("localhost", "username", "password"); mysql_select_db("testblob"); $sql = "SELECT image FROM testblob WHERE image_id=0"; $result = mysql_query("$sql"); header("Content-type: image/jpeg"); echo mysql_result($result, 0); mysql_close($link);
而不是将图像存储在数据库中,而是将其存储在磁盘中的文件夹中,并将其位置存储在数据库中。
请注意,从DB提供的图像通常比从磁盘提供图像慢得多。
你将开始一个PHP进程,打开一个数据库连接,让DB从同一个磁盘读取镜像数据,然后像文件系统一样cachingRAM,然后通过less量的套接字和缓冲区来传输数据,然后通过默认的PHP它不可caching,并增加了分块HTTP编码的开销。
OTOH现代Web服务器可以通过less量优化的内核调用(内存映射文件和传递给TCP堆栈的内存区域)来提供图像,这样他们甚至不会复制内存,几乎没有开销。
在一台机器上可以同时提供20或2000张图像,这是一个区别。
所以不要这样做,除非你绝对需要事务完整性(实际上甚至可以用DB和文件系统清理例程中的图像元数据来完成),并知道如何改进PHP的HTTP处理以适合图像。
我也build议考虑这一点,然后select将图像存储在您的文件系统,而不是数据库..看到这里: 在DB中存储图像 – 是或否?
我的意见是,而不是将图像直接存储到数据库,build议将图像位置存储在数据库中。 当我们比较这两个选项时,为了安全起见,将数据存储在数据库中是安全的。 缺点是
-
如果数据库损坏,无法检索。
-
与其他选项相比,从数据库检索图像文件速度较慢。
另一方面,在db中存储图像文件位置将具有以下优点。
-
这很容易找回。
-
如果存储多个图像,我们可以轻松地检索图像信息。
就我个人而言,我不会将图像存储在数据库中,而是将其放置在无法从外部访问的文件夹中,并使用数据库来跟踪其位置。 保持数据库的大小,你可以通过使用PHP来包含它。 那么没有PHP访问那个图像就没有办法了