如何用PHP显示BLOB数据?我已经将BLOB输入到DB中,但是如何检索它呢?任何例子都会很棒。
答案 0 :(得分:2)
简单示例:
$blob_data = "something you've got from BLOB field";
header('Content-type: image/jpeg'); // e.g. if it's JPEG image
echo $blob_data;
答案 1 :(得分:2)
我考虑投票结束这个副本,但标题非常好,并且通过其他问题查看,我找不到一般问题的完整答案。这些问题背叛了对HTTP基础知识的缺乏理解,所以我写了这个长答案。我已经掩饰了一点,但任何了解以下内容的人可能都不需要问这样的问题。或者,如果他们这样做,他们就能够提出更具体的问题。
首先 - 如果您要将图像或其他文件存储在数据库中,请停止并重新考虑您的体系结构。 RDBMS并未真正优化以处理BLOB。有许多(非关系型)数据库专门用于处理文件。它们被称为文件系统,他们真的很擅长这个。至少有95%的时间我发现常规文件卡在RDBMS中,这一点毫无意义。首先,考虑不将文件数据存储在数据库中,使用文件系统,并将一些小数据存储在数据库中(如果必须,可以使用路径,通常可以组织文件系统,所以您只需要一个独特的身份)。
那么,您确定要将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请求!你可能收到了回复。看看回应。您会看到所有标题,后跟一个空白行,然后是Google主页的HTML代码。
那又怎样?
现在你知道了什么是Web服务器。他们接受请求(如GET /
),并返回响应(由标题后跟空行(两个连续的换行符),后跟数据)。
现在,是时候意识到:
您的网络应用程序实际上只是一个自定义的Web服务器
您编写的所有代码都会接受请求,并将其转换为HTTP响应。所以你基本上只是制作一个专门版本的apache,或IIS,或nginx,或轻松,或其他什么。
现在,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()函数,该函数设置标题,并确保首先发送它们(并从数据中分离)。完成设置标题后,您只需发送数据即可。
只要你的标题为客户提供了有关如何处理数据有效负载的足够信息,那么一切都是笨拙的。
万岁。
答案 2 :(得分:1)
这个问题已在其他地方被提出并得到解答。请从昨天开始查看我对这个问题的回答:Image from MySQL database not printing
如果这不重复,请告诉我们,您的问题不同。
干杯!