【发布时间】:2011-04-13 00:45:30
【问题描述】:
如何使用 PHP 显示 BLOB 数据?我已将 BLOB 输入到数据库中,但我将如何检索它?任何例子都会很棒。
【问题讨论】:
-
对不起,BLOB,我的意思是像一张照片
如何使用 PHP 显示 BLOB 数据?我已将 BLOB 输入到数据库中,但我将如何检索它?任何例子都会很棒。
【问题讨论】:
我考虑过投票结束这个重复,但标题非常好,查看其他问题,我没有找到一般问题的完整答案。这类问题暴露了对 HTTP 基础知识的缺乏理解,所以我写了这个长答案。我已经掩饰了一点,但是任何理解以下内容的人可能都不需要问这样的问题。或者如果他们这样做了,他们就可以提出更具体的问题。
首先 - 如果您将图像或其他文件存储在数据库中,请停止并重新考虑您的架构。 RDBMS 并没有真正针对处理 BLOB 进行优化。有许多(非关系)数据库专门用于处理文件。它们被称为文件系统,它们非常擅长这个。至少 95% 的时间我发现常规文件卡在 RDBMS 中,这是毫无意义的。所以首先,考虑不将文件数据存储在数据库中,使用文件系统,并在数据库中存储一些小数据(如果必须的话,通常可以组织文件系统,所以你只需要唯一的 ID)。
那么,您确定要将 blob 存储在数据库中吗?
在这种情况下,您需要了解 HTTP 的工作原理。无需过多介绍,每当某些客户端请求 URL(发出 HTTP 请求)时,服务器都会以 HTTP 响应进行响应。 HTTP 响应有两个主要部分:标头和数据。这两部分由两个连续的换行符分隔。
在线路上的标头是简单的纯文本键/值对,如下所示:
Name: value
并用换行符分隔。
数据基本上是一个 BLOB。这只是数据。解释数据的方式(由客户端)根据伴随它的 Content-Type 标头的值来决定。 Content-Type 标头指定数据段中包含的数据的Internet Media Type。
看看效果
这并没有什么神奇之处。对于常规的 HTML 页面,整个响应是人类可读的。请尝试以下操作:
$ telnet google.com 80 # connect go google.com on port 80
你会看到类似的东西:
Trying 74.125.113.104...
Connected to google.com.
Escape character is '^]'.
现在输入:
GET /
(后跟返回)。
您刚刚发出了一个非常简单的 HTTP 请求!你可能已经收到了回复。看看回复。您会看到所有的标题,然后是一个空行,然后是谷歌主页的 HTML 代码。
那又怎样?
所以现在您知道 Web 服务器的作用了。他们接受请求(如GET /),并返回响应(由标题后跟一个空行(两个连续的换行符)后跟数据组成)。
现在,是时候意识到这一点了:
您的网络应用程序实际上只是一个定制的网络服务器
您编写的所有代码都接受任何请求,并将其转换为 HTTP 响应。所以你基本上只是在制作一个专门的 apache、IIS、nginx、lighty 或其他版本。
现在,Web 服务器通常处理请求的默认方式是在目录(文档根目录)中查找文件,查看它以确定要发送哪些标头,然后发送这些标头,然后是文件内容。
但是,虽然您的网络服务器神奇地为文件系统中的文件执行了所有这些操作,但它完全不知道 RDBMS 中的某些 BLOB。所以你必须自己做。
如果您知道 BLOB 的内容是应该根据同一张表中的“名称”列命名的 JPG 图像,您可能会执行以下操作:
<?php
$result = query('select name, blobdata from table where id = 5');
$row = fetch_assoc($result);
header('Content-Type: image/jpeg');
echo $row['blobdata'];
?>
(如果您想提示浏览器应该下载文件而不是显示它,您可以使用额外的标题,例如:header('Content-Disposition: attachment; filename="' . $row['name'].'"');)
PHP 足够聪明,可以提供 header() 函数,该函数设置标题,并确保它们首先发送(并与数据分开)。设置完标头后,您只需发送数据。
只要您的标头为客户端提供了有关如何处理数据有效负载的足够信息,一切都很好。
万岁。
【讨论】:
简单示例:
$blob_data = "something you've got from BLOB field";
header('Content-type: image/jpeg'); // e.g. if it's JPEG image
echo $blob_data;
【讨论】:
【讨论】: