Помощь в чтении данных двоичных изображений из SQL Server в PHP - PullRequest
2 голосов
/ 13 апреля 2010

Я не могу найти способ считывать двоичные данные с 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; 
?>

Вот как я должен был отобразить изображение. Спасибо за упоминание шестнадцатеричной подсказки, это позволило мне выяснить, что не так.

1 Ответ

2 голосов
/ 13 апреля 2010

Нет опыта работы с SQLServer, но я работал с BLOB-объектами в MySQL. У вас есть два варианта,

  1. Удалить двоичные данные, чтобы они работали в запросе SQL. Вы можете сделать это, используя addlashes () перед вставкой данных и stripslashes (), когда они возвращаются.

  2. Использование шестнадцатеричного синтаксиса запроса SQL.

Не уверен, что это стандартный SQL, но в MySQL вы можете читать BLOB в шестнадцатеричный код, например,

 select hex(image) from table;

Вы можете записывать двоичные данные как шестнадцатеричные в SQL, как X'1234ABCD '.

PHP предоставляет hex2bin / bin2hex, чтобы вы могли легко конвертировать.

...