我对这两个领域的经验有限,所以我需要一些代码来帮助我开始解决这个问题。
首先,您需要创建一个存储图像的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);
mysql_real_escape_string
。 - Andomar不要将图片存储在数据库中,而是将它们存储在硬盘的文件夹中,并将它们的位置存储在数据库中。
请注意,从数据库中提供图像通常比从磁盘提供图像要慢得多。
你需要启动 PHP 进程,打开数据库连接,让数据库从与文件系统相同的磁盘和缓存 RAM 中读取图像数据,通过几个套接字和缓冲区传输数据,然后再通过 PHP 推送出去。而 PHP 默认情况下会使它不可缓存并添加分块 HTTP 编码的开销。
相比之下,现代 Web 服务器可以通过只进行少量优化的内核调用(内存映射文件和将这个内存区域传递给 TCP 栈),仅服务于那些无需复制内存且几乎没有任何开销的图片。
这就是一台机器能够同时服务于20张或2000张图像的差别。
所以,不要这样做,除非你绝对需要事务完整性(实际上,即使是这种情况,只用图像元数据在数据库中,还有文件系统清理例程也可以完成),并知道如何改善 PHP 的 HTTP 处理方式以适合图片。
个人建议不要将图片存储在数据库中,可以将其放入一个无法从外部访问的文件夹中,并使用数据库来跟踪其位置。这样可以使数据库大小保持较小,并且可以通过使用PHP来包含它。这样就没有办法在没有PHP的情况下访问该图片。
我认同 @Andomar 的基本概念,但为了避免在 SQL 中存储大量数据,应将实际图像存储在磁盘上。请记住,在 SQL 中,一个大字段是 255 个字符。因此,您需要将图像文件存储为 Blob,这在您只有少量行(想象一下:数百行而不是数百万行)时效果很好。这个推断很复杂,但这是个好习惯。我是这么知道的:
我写了一个大型项目,存储了很多(很多)图像。总是将它们保存在磁盘上,以避免 SQL 的麻烦。如果您担心数据库损坏会让您无法将图像“重建”到数据库中,那么有一个简单的解决方法(除了备份 SQL 表格)
使用有意义的目录名称和解析,将图像存储在目录树中。例如,按时间存储可能看起来像“/year/month/day/picture.jpg”,按用户存储可能看起来像“/user_id/picture.jpg”。将其作为概念,并仅在 SQL 中存储路径。这将使您的 SQL 表格变得小而经常可缓存,并允许您的 SQL 表格位于一个服务器上,而您的图像则存储在另一个“服务器”上,例如 AWS 的 S3。
如果你真的很担心,你可以在与图像本身相同的目录中存储一个名为“{image_name)_meta.json”的文件。将其中填充有关于图像的元数据,这些元数据通常存储在数据库表中。如果表损坏了,你可以编写一个小函数来遍历树并从JSON文件重建表格。当然,这会占用更多的磁盘空间,但它非常便宜(想想:AWS的S3)。不要将图像存储在数据库中,而是将其存储在手机和电脑中,并仅使用其路径,这将节省您的数据库空间。