Получить данные изображения из mssql с помощью php (utf-8)

Из php-скрипта (PHP 5.3.10-1 на Ubuntu3.6) я подключаюсь к серверу 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

((С sqlsrv на сервере MSSQL я мог бы использовать это:

$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­...

person borazslo    schedule 13.06.2013    source источник
comment
Так в чем твой вопрос?   -  person Tobias Golbs    schedule 13.06.2013
comment
Как я могу распечатать изображение из данных с помощью PDO   -  person borazslo    schedule 13.06.2013
comment
Не забывайте, что вы должны хранить свое изображение в формате base64, а затем декодировать его при извлечении. Кажется, вы не расшифровываете данные. Вы его кодировали?   -  person Robert Seddon-Smith    schedule 13.06.2013
comment
База данных, сделанная другими. Так что вполне возможно, что он не закодирован. (Но с sqlsrv у меня это работало на сервере.) В базе данных он, кажется, начинается с: 0x424DF630030000000000360000002800000... (Microsoft SQL Server Management Studio Express)   -  person borazslo    schedule 13.06.2013
comment
@borazslo Тип файла — файл BMP.   -  person    schedule 14.06.2013


Ответы (2)


Попробуйте добавить следующие заголовки:

  • Контент-диспозиция
  • Контент-Передача-Кодирование
  • Длина содержимого

В 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
person Stephan    schedule 13.06.2013
comment
Нет. :( С 'Content-Length:'.strlen($lob)... Он возвращает то же самое, что и с первым заголовком. :( - person borazslo; 13.06.2013
comment
Но должно быть что-то не так с двоичным кодом в моем коде. Как и в рабочей версии sqlsrv, есть опция SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY). Как мне реализовать это в PDO? - person borazslo; 13.06.2013
comment
Если ваша версия sqlsrv работает, понюхайте (например, через панель инструментов Google Chrome Dev) заголовки, отправленные в браузер, а затем сравните эти заголовки с теми, которые отправлены вашей версией PDO. - person Stephan; 13.06.2013

Недавно я боролся с аналогичной проблемой хранения. Оказалось, что я цитировал данные своего двоичного изображения перед вставкой в ​​таблицу базы данных. Итак, убедитесь, что вы не добавляете кавычки и не превращаете его в строку, как это случайно сделал я.

Вот подготовительная работа, которая выполняется с существующим локальным файлом, чтобы получить правильные данные для хранения в вашей базе данных. Кроме того, убедитесь, что у вас есть функция 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;
}

Я надеюсь, что это поможет кому-то.

person jjwdesign    schedule 29.04.2016
comment
Спасибо, что поделились своим опытом. Это не решает исходную проблему, так как я заполнил базу данных другими. Но ваш опыт мог бы помочь в реверс-инжиниринге. Я надеюсь, что это будет полезно для кого-то. - person borazslo; 30.04.2016