2

SQLサーバーからPHPにバイナリデータを読み取る方法がわからないようです。ファイルシステムではなく、SQLテーブルに画像を直接保存できるようにする必要があるプロジェクトに取り組んでいます。

現在、私は次のようなクエリを使用しています。

INSERT INTO myTable(Document)SELECT * FROM OPENROWSET(BULK N'C:\ image.jpg'、SINGLE_BLOB)as BLAH

これは実際に画像をテーブルに挿入するのに問題なく機能しますが、画像を取得して画像を元に戻す方法はまだわかりません。

varbinary(MAX)私はこれをPHPで行っており、最終的にはそれからストアドプロシージャを作成する必要がありますが、そのバイナリデータ( )を取得してその場で画像を生成する方法を誰かに教えてもらえますか。

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'];

関数hex2bin($ h)
  {{
  if(!is_string($ h))はnullを返します。
  $ r ='';
  for($ a = 0; $ a <strlen($ h); $ a + = 2){$r。=chr(hexdec($ h{$a}。$h{($ a + 1)})); }
  $rを返します。
  }

$ image = hex2bin($ image);

header( "Content-type:image / gif");

$imageを印刷します。

出口;
?>

これが私が画像を表示しなければならなかった方法です。六角形の先端に言及してくれてありがとう、それは私が何が悪かったのかを理解することを可能にしました。

4

2 に答える 2

2

SQLServerの経験はありませんが、MySQLでBLOBを使用しました。2つのオプションがあります。

  1. バイナリデータをエスケープして、SQLクエリで機能するようにします。これを行うには、データが挿入される前にaddslashes()を使用し、データが戻ってきたときにstripslashes()を使用します。

  2. SQLクエリの16進構文を使用します。

標準のSQLかどうかはわかりませんが、MySQLでは、次のようにBLOBを16進数に読み込むことができます。

 select hex(image) from table;

X'1234ABCD'のように、SQLでバイナリデータを16進数として書き込むことができます。

PHPにはhex2bin/bin2hexが用意されているため、簡単に変換できます。

于 2010-04-13T16:19:48.580 に答える