windows 7,php 5.3,当从mssql中使用sqlsrv获取二进制数据时,数据加倍

时间:2011-11-22 14:33:18

标签: php sql-server sql-server-2005 sql-server-2005-express

好的,所以我在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

我在linux中使用freetds驱动程序,在windows中使用php_pdo_sqlsrv_53_nts_vc9

我可以采取哪些措施来获取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 个答案:

答案 0 :(得分:1)

很高兴听到你找到一些解决方案,如果不是一个好的解决方案:/

我在PHP应用程序上测试Mssql时遇到过这种情况,但从来没有进一步。您可以检查的另一个提示是PDO大对象上的PHP文档(如varbinary和image SQL数据类型):http://de2.php.net/manual/en/pdo.lobs.php

当您将图像作为流读取时,结果可能是一致的吗?