Я не могу найти способ считывать двоичные данные с SQL-сервера в PHP. Я работаю над проектом, в котором мне нужно иметь возможность хранить изображение непосредственно в таблице SQL, а не в файловой системе.
В настоящее время я использую запрос, подобный этому:
INSERT INTO myTable (Документ)
ВЫБРАТЬ ИЗ
OPENROWSET (BULK N'C: \ image.jpg ', SINGLE_BLOB) как BLAH
Это прекрасно работает, когда вы фактически вставляете изображение в таблицу, но я пока не нашел способа извлечь его и вернуть мое изображение.
Я делаю это с PHP, и в конечном итоге мне придется сделать из него хранимую процедуру, но кто-нибудь может просветить меня, как получить эти двоичные данные (varbinary(MAX)
) и сгенерировать изображение на лету.
Я ожидал, что будет просто использовать оператор SELECT
и добавить тип содержимого к заголовкам, которые указывают, что это изображение, но оно просто не работает. Вместо этого на странице будет просто отображаться имя файла, с которым я сталкивался в прошлом, и понимать, что это ошибка с данными изображения.
РЕДАКТИРОВАТЬ: Я думаю, я понял это. При чтении из хранимой процедуры SQL Server отправлял не более 8000 байт, поэтому возникли проблемы с изображениями, которые я тестировал.
$q = "Get_Picture_Test_SP @pk_rms_id=1443546";
$res = mssql_query($q);
$row = mssql_fetch_assoc($res);
$image = $row['picture'];
function hex2bin($h)
{
if (!is_string($h)) return null;
$r='';
for ($a=0; $a<strlen($h); $a+=2) { $r.=chr(hexdec($h{$a}.$h{($a+1)})); }
return $r;
}
$image = hex2bin($image);
header("Content-type: image/gif");
print $image;
exit;
?>
Вот как я должен был отобразить изображение. Спасибо за упоминание шестнадцатеричной подсказки, это позволило мне выяснить, что не так.