windows 7, php 5.3, при извлечении двоичных данных с помощью sqlsrv из mssql данные удваиваются - PullRequest
1 голос
/ 22 ноября 2011

хорошо, поэтому у меня есть изображения на сервере MSSQL 2005 (экспресс), которые я хочу записать в файлы. с тем же куском кода, на linux работает нормально, на windows пишет данные дважды в файл

file_put_contents($file, $val);
$val = basename($file);

Я знаю, что это не проблема file_put_contents (), потому что я также пытался с fwrite выходной файл в Windows имеет двойной размер по сравнению с Linux

-rw-rw-r-- 1 dimitris dimitris  891768 2011-11-22 16:13 eshop_products__2201.jpg
-rw-rw-r-- 1 dimitris dimitris  445884 2011-11-21 19:15 eshop_products__2201_linux.jpg

Я использую драйвер freetds для Linux и php_pdo_sqlsrv_53_nts_vc9 в Windows

есть идеи, что я могу сделать, чтобы получить правильные данные в Windows? может быть, какую-то конфигурацию я пропустил?

старшие байты каждого файла:

файл windows:

ASCII (php substr):
FFD8FFE000104A46494600010100000100010000FFDB0043000302020302020303030304030304050805050404050A070706080C0...etc...

hex:
00000000:  46 46 44 38 46 46 45 30  30 30 31 30 34 41 34 36  FFD8FFE000104A46
00000010:  34 39 34 36 30 30 30 31  30 31 30 30 30 30 30 31  4946000101000001
00000020:  30 30 30 31 30 30 30 30  46 46 44 42 30 30 34 33  00010000FFDB0043
00000030:  30 30 30 33 30 32 30 32  30 33 30 32 30 32 30 33  0003020203020203
00000040:  30 33 30 33 30 33 30 34  30 33 30 33 30 34 30 35  0303030403030405
00000050:  30 38 30 35 30 35 30 34  30 34 30 35 30 41 30 37  0805050404050A07
00000060:  30 37 30 36 30 38 30 43  30 41 30 43 30 43 30 42  0706080C0A0C0C0B

Файл Linux:

ASCII (php substr):
����JFIF��C

hex:
00000000:  ff d8 ff e0 00 10 4a 46  49 46 00 01 01 00 00 01  ......JFIF......
00000010:  00 01 00 00 ff db 00 43  00 03 02 02 03 02 02 03  .......C........
00000020:  03 03 03 04 03 03 04 05  08 05 05 04 04 05 0a 07  ................
00000030:  07 06 08 0c 0a 0c 0c 0b  0a 0b 0b 0d 0e 12 10 0d  ................
00000040:  0e 11 0e 0b 0b 10 16 10  11 13 14 15 15 15 0c 0f  ................
00000050:  17 18 16 14 18 12 14 15  14 ff db 00 43 01 03 04  ............C...
00000060:  04 05 04 05 09 05 05 09  14 0d 0b 0d 14 14 14 14  ................
00000070:  14 14 14 14 14 14 14 14  14 14 14 14 14 14 14 14  ................

Код, извлекающий файл из базы данных, основан на платформе yii с использованием функции команд yii (php cli)

Строки подключения:

Linux

'connectionString' => 'dblib:host=192.168.56.101;port=1433;dbname=mssqldb',

окна

'connectionString' => 'sqlsrv:Server=192.168.56.101;Database=mssqldb',

Код:

$rows = $this->db->createCommand("SELECT * FROM $viewName WHERE 1=1")->queryAll();

/*
 * Convert charset and extract photos from view
 */
foreach ($rows as $row) {
    // convert charset / export photos
    foreach ($row as $key => &$val) {
        // charset conversion, on fields that do not contain photos
        // $viewCfg is an array I maintain to know which field does what
        if (empty($viewCfg['photos']) || !in_array($key, $viewCfg['photos'])) {
            $val = @iconv("Windows-1253", "UTF-8", $val);
        // grab image in file
        } else {
            $id = '';
            foreach ($viewCfg['keys'] as $fieldName) {
                $id .= '_' . $row[$fieldName];
            }

            $file = Yii::app()->params['pathPhotos'] . '/' . $viewName . '_' . $id . '.jpg';

            if ($val) {
                if (file_exists($file) && (file_get_contents($file)!=$val))
                    unlink($file);

                file_put_contents($file, $val);
                $val = basename($file);
            }
        }
    }
// ... do the rest

1 Ответ

1 голос
/ 23 ноября 2011

Рад слышать, что вы нашли какое-то решение, если не самое удачное: /

У меня была такая ситуация при тестировании Mssql на PHP-приложении, но я никогда не получал дальше.Еще один совет, который вы можете проверить - это документ PHP по крупным объектам PDO (например, типы данных SQL varbinary и image): http://de2.php.net/manual/en/pdo.lobs.php

Может быть, результат будет согласованным, когда вы читаете изображение как поток?

...