2016-04-07 5 views
0

Iは、次のコマンドを使用して、PostgreSQLの画像を読み込む:Dを使ってPostgreSQLからバイナリブロブをロード/アンロードする方法は?

UPDATE "USERS" SET userblob = (pg_read_binary_file('img.png')::bytea) WHERE id>1; 

フィールドタイプがある:

今DBはbytea this等が挙げられます。

次に、バイナリBLOBをファイルシステムに書き戻そうとしました。そして、次のようなデータを含む非常に大きなファイルを得ました:[56, 57, 53, 48, 52, 101, 52, 55, 48, 100, 48, 97, 49 ...

私は間違っていますか?私のコードは次です:

struct MyData 
{ 
    string guid; 
    string id; 
    string name; 
    byte [] userblob; 
    string fl; 
} 
     auto rs = pgstmt.executeQuery(`SELECT guid::text, id, name, userblob, "FL" FROM "USERS" where "FL" = 10;`); 
    while (rs.next()) 
    { 
     md.guid = to!string(rs.getString(1)); 
     md.id = to!string(rs.getString(2)); 
     md.name = to!string(rs.getString(3)); 
     md.userblob = rs.getBytes(4); 
     md.fl = to!string(rs.getBytes(5)); 

     std.file.write("output.png", cast(byte[])md.userblob); 
     readln; 

     mydata ~= md; 
    } 

UPD:私は読んだドキュメントです。 PostgreSQLのバイトアは痛みです。すべてのテキストをbase64エンコーディングで保存する方がはるかに優れています。 実例: UPDATE "USERS" SET userblob = encode(pg_read_binary_file('img.png'), 'base64') WHERE id>1;

+0

どのクライアントドライバを使用していますか?クライアントドライバは、このためにあなたのために世話をする必要があります。 PgJDBCはpsqlODBCを実行しますが、libpqは何かの制限付きドライバを使用していますか? –

答えて

1

bytea型の符号化/復号化機能で問題が発生しました。 ddbc v0.2.32で修正済み

0

ここで問題の原因はPostgres byteaのようです。私がPostgresのドキュメントで読むことができるところから、byteaはバイト値の8進値の文字列表現として印刷不可能な値をバイトストリームに格納します。 これは、実際のバイナリストリームを取得するために何らかの処理を必要とします。

DDBCがこれらをどのように処理するかを見ることができます。

私はあなた/あなたのプロジェクトファイルのいずれかでbyte[] byteaToBytes(string s)機能を貼り付けて、次のようにコードを適応させるコピーを示唆している:

while (rs.next()) 
{ 
    ... 
    md.userblob = byteaToBytes(to!string(rs.getString(4))); 
    ... 
    std.file.write("output.png", cast(byte[])md.userblob); 
    readln; 

    mydata ~= md; 
} 
+0

'' ' \t \tバイト[] userblob; \t \t ... \t \t md.userblob = rs.byteaToBytes(4); \t \t エラー:プロパティ 'byteaToBytes' 型 'ddbc.core.ResultSet' \t \t '' ' –

+0

Postgresは直接バイトを保存しない理由理由はありますか?なぜ内部形式に変換するのですか? –

+0

これはまだ間違っているようです。私は元の画像を取得できませんhttp://img.ctrlv.in/img/16/04/07/57063cd3dc645.png –

関連する問題