从php脚本(Ubuntu3.6上的PHP 5.3.10-1)我连接到MSSQL Server,我想从图像字段类型中检索图像数据。我想要打印出来。
我可以从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...
答案 0 :(得分: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
答案 1 :(得分:0)
我最近在处理类似的存储问题。原来我在插入数据库表之前引用了我的二进制图像数据。因此,请确保您没有添加引号并将其转换为字符串 - 就像我不小心那样。
这是在现有本地文件上完成的准备工作,以获取存储到数据库中的正确数据。此外,请确保您有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;
}
我希望这有助于某人。