【问题标题】:Display Blob content after fetching from firebird db从 firebird db 获取后显示 Blob 内容
【发布时间】:2019-01-09 23:33:09
【问题描述】:

当我运行以下查询时

select first 1 IMG from img_lib;

我得到的输出为 IMG 4cc:0 BLOB 显示设置为子类型 1。此 BLOB:subtype = 0

任何人都可以帮助我使用 PHP 代码将 blob 内容显示为图像吗? 我不认为 MySQL 会在这里工作,谁能帮我处理 firebird 查询?

【问题讨论】:

标签: php firebird


【解决方案1】:

PHP 提供了两个库来处理 Firebird/Interbase 数据库:IbasePDO

Ibase 提供了两种检索 blob 的方法。 一种是使用 ibase_blob_get 函数的延迟加载:

if (is_null($field)) return null;
$info = ibase_blob_info($field);
$handle = ibase_blob_open($field);
return ibase_blob_get($handle, $info[0]);

这种方式很好,当您只需要获取一些 blob 而不是全部时,因为这是一项昂贵的操作。

另一种方法是在ibase_fetch_assoc函数中使用IBASE_TEXT获取标志参数或获取object/row。它将在获取结果中正确返回 blob 内容。

第二个库,带有Firebird 驱动程序的 PDO,自动获取 blob。

接下来将 BLOB 内容加载到内存后,您需要将其作为图像输出。 这是一个示例代码,假设您有一个 jpeg 图像格式:

<?php
// fetch here blob content described in previous methods
header('Content-Type: image/jpeg');
echo $blob_content;

稍后将图像源指向您的脚本,例如&lt;img src="blob_image.php" /&gt;

【讨论】:

  • IBASE_TEXT 是否会返回超过 VARCHAR 大小最大限制 (32KB AFAIR) 的大 blob 内容?
  • "稍后将图像源指向您的脚本" - 或使用 data:// URI 方案:-D
  • @Arioch'The,据我所知,是的,我们存储大 blob 并毫无问题地检索它们。如果内存允许,PHP 引擎会获取整个 blob 内容:)
  • 太棒了!我只是害怕 lib 变得懒惰并将 SQL SELECT 修改为...cast (blob-column-name as varchar(...) collate octet)...
  • @Arioch'The,目前我们使用 PDO。修补了一些错误,现在它运行良好。检查ibase_blob_get 函数,它允许在块 ibase_blob_get(handle, size) 中加载大 blob。奇怪的是,在我们使用 ibase_ 时,我们一次调用就加载了它。 PDO 在内部分块加载整个 blob:github.com/php/php-src/blob/master/ext/pdo_firebird/…
猜你喜欢
  • 2010-10-10
  • 2020-02-20
  • 2019-05-09
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-18
相关资源
最近更新 更多