PHP显示BLOB数据?

2024-03-16

如何使用 PHP 显示 BLOB 数据?我已将 BLOB 输入到数据库中,但如何检索它?任何例子都会很棒。


我考虑投票结束这个重复项,但标题相当不错,并且浏览其他问题,我没有找到一般问题的完整答案。这类问题暴露了对 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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP显示BLOB数据? 的相关文章

随机推荐

  • 修复了移动 Safari 网站上带有文本字段的标题

    我已经四处寻找了一段时间 但似乎找不到解决此问题的方法 当输入字段在移动 safari 中获得焦点 尚未检查其他浏览器 时 固定元素将由于 safari 将该元素置于视图中 更靠近中心 而跳转 该错误仅在用户滚动时发生 如果用户仍位于页面顶
  • 我可以使用python创建类似flash的浏览器游戏吗?

    是否可以使用python创建类似flash的浏览器游戏 其实我想用它来做经济模拟 不过相当于页游一样 Davoud 答案是肯定的 假设您认为这是您想要做的事情的一个很好的例子 http pyjs org examples Space htm
  • Phong 照明:单独添加镜面照明还是与环境光和漫反射一起添加?

    我正在尝试实现 Phong 照明 在某些教程中 将镜面光照添加到环境光照和漫射光照中 然后将总光照乘以纹理颜色 我还看到了一个教程 其中在添加环境光和漫射光与纹理颜色相乘之后单独添加镜面照明 这是一个片段着色器 其中包含两个选项和屏幕截图
  • 使用 SAVON response.to_hash 转换方法解析 SOAP 响应

    我在解析 SOAP 响应时遇到问题 这是我的代码 require rubygems require savon client Savon Client new http 1 2 3 4 xyz abcd fsds wsdl res clie
  • 在 Heroku 上备份/加载后,PostgreSQL 数据库大小较小

    最近 我创建了一个新的 Heroku 应用程序用于生产 并使用我从临时数据库中获取的备份填充它的数据库 问题在于 如 Heroku 的 Postgres 网页上所示 这两个数据库的数据库大小不同 我从中获取备份的第一个数据库大小为 360
  • 更改 React Bootstrap 中展开的手风琴面板的标题样式

    对于单击和活动 展开的面板 我想更改 css 样式 那是因为我想切换面板标题内向上或向下指向的图像箭头 我能够获取打开面板的 eventKey 但无法使用面板标题CSS 类 你有什么建议 Thanks 代码如下
  • 如何将已通过身份验证的用户从登录页面重定向到主页

    我正在使用 Apache Shiro 开发 JSF 应用程序 我使用 Shiro 验证用户并将她重定向到主页 这没有问题 身份验证后 当我尝试访问登录页面时 它不会将我重定向到主页 即使已经有登录的用户 我也可以再次登录 我正在做程序化登录
  • Java、C++、C# 等如何通过 < 和 > 解决这种特定的语法歧义?

    我曾经认为 C 是一种 奇怪 的语言 它与 lt and gt 但是在尝试实现解析器之后 我想我发现了一个打破的例子大概every java中的通用方法调用是
  • 谁有关于 PostgreSQL 后台进程的文档?

    谁有关于 PostgreSQL 后台进程的文档 我想了解有关这些后台进程的详细信息 postgres 记录器进程 postgres 编写进程 postgres wal writer进程 postgres autovacuum 启动程序进程
  • 具有透明背景的CWnd

    我想创建一个基于 CWnd 的类 它将引入具有透明背景的控件 只要内容是静态的 创建一个控件并用透明背景绘制其内容对我来说没什么大不了的 问题是当我想创建一个内容不断变化的控件时 这是因为我不知道如何用父背景删除控件的内容 一般情况下可能不
  • 如何开始构建 django 网站以及 django 如何构建页面?

    我为我的个人网站启动了一个 django 项目来学习 django 到目前为止 我已经设置了我需要的一切开发环境并遵循this https docs djangoproject com en dev intro tutorial01 创建一
  • git push --recurse-submodules=on-demand 并不是真正的递归

    我有以下项目结构 root project A C B A 和 B 是根项目的子模块 C 又是一个子模块 假设我对项目 A B 和 C 进行了更改 并且 将这些变化提交给各自的指数 之后我更新 根项目中对 A 和 B 的引用并提交该更改 以
  • 如果类包含基类类型的成员作为第一个元素,然后是其他成员,编译器可以优化空基吗?

    考虑 struct empty struct child empty empty a sizeof int sizeof empty int b Assume sizeof int gt sizeof empty 标准是否强制要求sizeo
  • 使用 g++ 编译 C++11

    我正在尝试将我的 C 编译器更新到 C 11 我搜索了一下 得出的结论是我必须使用该标志 std c 0x or std gnu 0x 但我对标志了解不多 谁能帮我 我使用的是 Ubuntu 12 04 这是当我尝试使用 C 11 中包含的
  • Composer更新问题

    我正在使用 laravel composer 我正在加载 way generators 包 当我运行 Composer update 时出现以下错误 加载包含包信息的 Composer 存储库 依赖项 包括 require dev 致命错误
  • Java:为什么我不能将 int 转换为 Long

    Java 中的所有数字都应该是 int 类型 以下行在 Java gt 1 5 中是合法的 Short s 1 Will compile to Short s Short valueOf short 1 thus you can t exc
  • 使用httr R包发送POST请求

    当通过 POST 请求发送服务器数据时 我不知道如何模仿浏览器的行为 以下是相关 URL 并附有说明 1 http kenpom com 2 http kenpom com register php frompage 1
  • Xcode 4.6 上的 Mach-O 链接器错误

    我在 Xcode 4 6 上有一个 iOS 应用程序 当我最近尝试在 iPhone 6 1 模拟器中构建和运行时 我收到了 Mach O 链接器错误 它继续说道 ld 架构 i386 的 17 个重复符号 clang 错误 链接器命令失败
  • 如何使用 Roslyn 代码修复提供程序 API 从文档中删除 SyntaxNode 列表?

    我正在使用自定义生成的变量声明SyntaxFactory VariableDeclaration和一个列表SyntaxNode是根据一定条件收集的 我做了以下事情 修改节点 var newRoot root ReplaceNode expr
  • PHP显示BLOB数据?

    如何使用 PHP 显示 BLOB 数据 我已将 BLOB 输入到数据库中 但如何检索它 任何例子都会很棒 我考虑投票结束这个重复项 但标题相当不错 并且浏览其他问题 我没有找到一般问题的完整答案 这类问题暴露了对 HTTP 基础知识缺乏了解