【问题标题】:Retrieve image data from mssql with php (utf-8)使用 php (utf-8) 从 mssql 检索图像数据
【发布时间】:2013-06-13 09:03:11
【问题描述】:

从一个 php 脚本(Ubuntu3.6 上的 PHP 5.3.10-1)我连接到一个 MSSQL 服务器,我想从图像字段类型中检索图像数据。我想打印它。

我可以从 MSSQL 获取数据,但无法将其打印/回显为有效图像。如何打印/回显/保存?

$db= new PDO('odbc:MYODBC', '***', '***');
$stmt = $db->prepare("USE database");
$stmt->execute();
$tsql = "SELECT image 
         FROM Pics 
         WHERE id = 12";
$stmt = $db->prepare($tsql);
$stmt->execute();

$stmt->bindColumn(1, $lob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);

header("Content-Type: image/jpg");

echo($lob); //not an image: 424df630030000000000360000002800 ...

imagecreatefromstring($lob);  // Data is not in a recognized format ...

$lob = fopen('data://text/plain;base64,' . base64_encode($lob), 'r'); //Resource
fpassthru($lob); //not an image: 424df63003000000000036000000280000 ...

PHP 脚本编码:UTF-8。

在 /etc/freetds/freetds.conf 中

[MYODBC]
host = myhost.com
client charset = UTF-8
tds version = 7

((使用 MSSQL 服务器上的 sqlsrv 我可以使用这个:

$image = sqlsrv_get_field( $stmt, 0, 
                      SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY));
header("Content-Type: image/jpg");
fpassthru($image);

))

更新:

echo base64_decode($lob); //Not an image: γn­τΣ}4ΣM4ΣM4ί­4ΣM4ΫΝ4ΣM4s­...

【问题讨论】:

  • 那么你的问题是什么?
  • 如何使用 PDO 从数据中打印图像
  • 不要忘记您必须将图像存储在 base64 中,然后在检索时对其进行解码。看来您没有解码数据。你编码了吗?
  • 别人做的数据库。所以它可能没有被编码。 (但使用 sqlsrv 它在服务器上为我工作。)在数据库中,它似乎开始于:0x424DF630030000000000360000002800000...(Microsoft SQL Server Management Studio Express)
  • @borazslo 文件类型为 BMP 文件。

标签: php sql-server image freetds


【解决方案1】:

尝试添加以下标题:

  • 内容处置
  • 内容传输编码
  • 内容长度

在 PHP 代码中:

header('Content-Type: image/jpg');
header('Content-Disposition:attachment; filename="my_file.jpg"');// Set the filename to your needs
header('Content-Transfer-Encoding: binary');
header('Content-Length: 12345');// Replace 12345 with the actual size of the image in bytes

【讨论】:

  • 不是。 :( 使用 "'Content-Length: '.strlen($lob)"... 它只返回与第一个标题相同的结果。:(
  • 但是我的代码中的“二进制”应该有问题。与工作中的 sqlsrv 版本一样,有一个“SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY)”选项。我应该如何将它实现到 PDO?
  • 如果您的 sqlsrv 版本有效,请嗅探(例如通过 Google Chrome 开发工具栏)发送到浏览器的标头,然后将这些标头与您的 PDO 版本发送的标头进行比较。
【解决方案2】:

我最近遇到了类似的存储问题。事实证明,我在插入数据库表之前引用了我的二进制图像数据。因此,请确保您没有像我不小心那样添加引号并将其转换为字符串。

这是对现有本地文件进行的准备工作,以获取要存储到数据库中的正确数据。另外,请确保您有 bin2hex() 可用或获取该函数的替换版本。

function prepareImageDBString($filepath) {

    $out = 'null';
    $handle = @fopen($filepath, 'rb');
    if ($handle) {
        $content = @fread($handle, filesize($filepath));
        // bin2hex() PHP Version >= 5.4 Only!
        $content = bin2hex($content); 
        @fclose($handle);
        $out = "0x" . $content;
    }
    return $out;
}

我希望这对某人有所帮助。

【讨论】:

  • 感谢您分享您的经验。它不能解决原来的问题,因为我的数据库被其他人填满了。但是您的经验可能对“逆向工程”有所帮助。我希望这对某人有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
相关资源
最近更新 更多