我考虑投票结束这个重复项,但标题相当不错,并且浏览其他问题,我没有找到一般问题的完整答案。这类问题暴露了对 HTTP 基础知识缺乏了解,所以我写了这个长答案。我已经掩盖了一点,但任何理解以下内容的人可能都不需要问这样的问题。或者如果他们这样做了,他们就能够提出更具体的问题。
First- 如果您在数据库中存储图像或其他文件,请停止并重新考虑您的架构。 RDBMS 并未真正针对处理 BLOB 进行优化。有许多(非关系型)数据库专门用于处理文件。他们叫文件系统,而且他们真的很擅长这一点。至少 95% 的情况下,我发现常规文件卡在 RDBMS 中,这是毫无意义的。所以首先,考虑not将文件数据存储在数据库中,使用文件系统,并在数据库中存储一些小数据(如果必须的话,可以使用路径,通常您可以组织文件系统,这样您所需要的只是一个唯一的 ID)。
那么,您确定要将 Blob 存储在数据库中吗?
在这种情况下,您需要了解 HTTP 的工作原理。无需赘述,只要某个客户端请求 URL(发出 HTTP 请求),服务器就会使用 HTTP 响应进行响应。 HTTP 响应有两个主要部分:标头和数据。两个部分由两个连续的换行符分隔。
线路上的标头是简单的纯文本键/值对,如下所示:
Name: value
并用换行符分隔。
数据基本上是 BLOB。这只是数据。数据的解释方式由客户端根据其附带的 Content-Type 标头的值决定。 Content-Type 标头指定网络媒体类型 http://en.wikipedia.org/wiki/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 请求!您可能已收到回复。看看回复。您将看到所有标题,后跟一个空行,然后是 google 主页的 HTML 代码。
So what?
现在您知道网络服务器是做什么的了。他们接受请求(比如GET /
),并返回响应(由标题组成,后跟一个空行(两个连续的换行符),后跟数据)。
现在,是时候认识到:
您的 Web 应用程序实际上只是一个定制的 Web 服务器
您编写的所有代码都会接受任何请求,并将其转换为 HTTP 响应。所以你基本上只是制作一个专门版本的 apache、IIS、nginx、lighty 等等。
现在,Web 服务器通常处理请求的默认方式是在目录(文档根目录)中查找文件,查看该文件以确定要发送哪些标头,然后发送这些标头,然后发送文件内容。
但是,虽然您的 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() 函数,该函数设置标头,并确保首先发送它们(并与数据分开)。设置完标头后,您只需发送数据即可。
只要您的标头为客户端提供了有关如何处理数据有效负载的足够信息,一切就都很顺利了。
Hooray.