如何使用PHP从MySQL数据库存储和检索图像?

Mas*_*ask 58 php mysql database blob

如何在MySQL中插入图像然后使用PHP检索它?

我在这两个领域的经验都很有限,我可以用一些代码让我开始搞清楚这一点.

And*_*mar 121

首先,您创建一个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 ''
);
Run Code Online (Sandbox Code Playgroud)

然后你可以写一个图像到数据库,如:

/***
 * 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);
Run Code Online (Sandbox Code Playgroud)

您可以在网页中显示数据库中的图像:

$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);
Run Code Online (Sandbox Code Playgroud)

  • 如果图像大于65K,则需要更改blob字段的类型.http://stackoverflow.com/questions/3503841/jpa-mysql-blob-returns-data-too-long (4认同)

小智 22

而不是将数据存储在数据库中,而是将它们存储在磁盘的文件夹中,并将它们的位置存储在数据库中.


Kor*_*nel 9

请注意,从DB提供图像通常比从磁盘提供图像慢得多.

你将开始一个PHP进程,打开一个数据库连接,让数据库从同一磁盘读取图像数据,将RAM作为文件系统读取缓存,通过几个套接字和缓冲区传输,然后通过PHP推出,默认情况下是它是不可缓存的,并增加了分块HTTP编码的开销.

OTOH现代Web服务器只需很少的优化内核调用(内存映射文件和传递给TCP堆栈的内存区域)即可为图像提供服务,因此它们甚至不会复制内存,几乎没有开销.

这是在一台机器上并行提供20或2000个图像之间的区别.

所以不要这样做,除非你绝对需要事务完整性(实际上甚至可以只用DB和文件系统清理例程中的图像元数据完成),并且知道如何改进PHP的HTTP处理以适合图像.


Sco*_*den 7

我还建议考虑这个,然后选择将图像存储在您的文件系统而不是数据库中..请参阅此处:在DB中存储图像 - 是或不是?


exu*_*sum 6

我个人不会将图像存储在数据库中,而是将其放在一个无法从外部访问的文件夹中,并使用数据库来跟踪其位置。保持数据库大小减小,您可以使用 PHP 将其包含在内。如果没有 PHP 就无法访问该图像


Gun*_*lan 6

我的意见是,不建议将图像直接存储到数据库中,而是建议将图像位置存储在数据库中.当我们比较两个选项时,在数据库中存储图像对于安全目的是安全的.缺点是

  1. 如果数据库已损坏,则无法检索.

  2. 与其他选项相比,从db检索图像文件很慢.

另一方面,在db中存储图像文件位置将具有以下优点.

  1. 它很容易检索.

  2. 如果存储了多个图像,我们可以轻松检索图像信息.