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

Posted

技术标签:

【中文标题】如何使用 PHP 从 MySQL 数据库中存储和检索图像?【英文标题】:How can I store and retrieve images from a MySQL database using PHP? 【发布时间】:2010-12-10 20:21:21 【问题描述】:

如何在 mysql 中插入图像,然后使用 php 检索它?

我在这两个领域的经验都有限,我可以使用一些代码来帮助我解决这个问题。

【问题讨论】:

我还建议您考虑这一点,然后选择将图像存储在您的文件系统而不是数据库中。请参见此处:***.com/questions/3748/… 【参考方案1】:

不要将图像存储在数据库中,而是将其存储在您的手机和电脑中,然后使用它的路径,因为它会保存您的数据库

【讨论】:

这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review【参考方案2】:

请注意,从数据库提供图像通常比从磁盘提供图像要慢得多很多

您将启动一个 PHP 进程,打开一个数据库连接,让数据库从与文件系统相同的磁盘和 RAM 中读取图像数据以进行缓存,通过几个套接字和缓冲区传输它,然后通过 PHP 推出,这默认情况下使其不可缓存并增加分块 HTTP 编码的开销。

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

这就是能够在一台机器上并行处理 20 或 2000 张图像的区别。

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

【讨论】:

【参考方案3】:

首先您创建一个 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);

【讨论】:

如果您的图像大于 65K,您需要更改 blob 字段的类型。 ***.com/questions/3503841/… 对于各种图像,我在上面的代码中遇到了编码和转义序列错误。我不得不替换 $imgData = file_get_contents($filename);与 $fp = fopen($filepath, 'r'); $imgData = fread($fp, 文件大小($filepath)); $imgData = 添加斜杠($imgData); fclose($fp);使其始终如一地工作。 答案顶部的链接绝对值得一看,因为它包含更多详细信息。 如果图像数据包含撇号,这似乎会非常失败。 @KrLx_roller:将图像存储在服务器文件夹中可能会更好,但这不是 OP 所要求的。因此,我认为这个问题是“有用的”。 +!【参考方案4】:

我的意见是,与其将图片直接存入数据库,不如将图片位置存入数据库。当我们比较这两个选项时,出于安全目的,将图像存储在数据库中是安全的。缺点是

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

    与其他选项相比,从 db 检索图像文件速度较慢。

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

    很容易找回。

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

【讨论】:

【参考方案5】:

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

【讨论】:

您的假设。现在拥有一个基于 Web/浏览器的应用程序非常普遍,您希望在离线模式下运行,因此您需要一些巧妙的缓存管理和/或基于 Web 的数据库(WebSQL、PouchDB、Couchbase、Mongo 等)中的图像。 这个答案声称是一个更好的解决方案; OP希望将图像存储在数据库中。 主观的,与如何将图像插入数据库的问题无关。【参考方案6】:

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

【讨论】:

【参考方案7】:

我还建议您考虑这一点,然后选择将图像存储在您的文件系统而不是数据库中。 看这里:Storing Images in DB - Yea or Nay?

【讨论】:

以上是关于如何使用 PHP 从 MySQL 数据库中存储和检索图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MySQL 数据库中存储和检索图像并使用 Php 将其显示在 html 中? [复制]

如何使用php将图像存储在mysql数据库中

如何从 PHP 代码中调用 MySQL 存储过程?

如何从 PHP 代码中调用 MySQL 存储过程?

如何从 PHP 代码中调用 MySQL 存储过程?

如何使用 php 从 mysql 数据库中显示非英文字符?