3

covers.cover画像ファイル (jpg/jpeg) を読み取り、タイプのデータベース テーブルに挿入する小さな Java プログラムを作成しましたbytea

byte[] coverJava メソッドに渡されるパラメーターに有効な jpeg データが含まれていることは確かですaddCover(int riddim_id, byte[] cover, byte[] thumbnail)(.jpeg ファイルに書き込んでテストしたところ、正常に表示されました)。

データベース関数add_cover(riddim INT, cover BYTEA, thumbnail BYTEA)は正しく呼び出されているようです。呼び出しの後、テーブルにデータがあり、SQL エラーは発生しません。

ただし、データはやや似ています

\377\330\377\340\000\020JFIF\000\001\001\001\001,\001,\000\000\377\333\000C\000\013\010\010\010\011\010\014\011\011\014\021\013\012\013\021\024\017\014\014\017\024\027\022\022\022\022\022\027\030\023\024\024\024\024\023\030\026\032\033\034\033\032\026""$$"".....0000000000\377\333\000C\001\014\014\014\020\020\020\027\021\021\027\030\024\023\024\030\036\033\034\034\033\036$\036\036\037\036\036$)#    #)&($$$(&++))++000000000000000\377\300\000\021\010\005\200\005\230\003\001\021\000\002\021\001\003\021\001\377\304\000\033\000\000\003\000\003\001\001\000\000\000\000\000\000\000\000\000\000\000\001\002\003\004\006\005\007\377\304\000U\020\000\001\002\004\003\005\004\010\003\006\005\003\003\001\001\021\001\002\021\000!1A\003\022Q\004"2Ba\005\023bq\006CRr\201\221\241\3603\261\301\024#c\202\321

など、私には有効なデータのようには見えません。私はもっ​​と統一されたもの( 、 、 のような特殊文字が少ない)、 のようなものを期待して,"まし$\x01E25A43

以下に示す PHP スクリプトであるにアクセスするとhttp://foo.bar/image.php、Firefox から、誤ったデータが含まれているため、画像を表示できないと表示されます。

BYTEA フィールドを正しく使用していないと思いますが、何が間違っているのかわかりません。助言がありますか?

データベース テーブルは次のようになります。

CREATE TABLE covers (
    cover_id              SERIAL      PRIMARY KEY,
    riddim_id             SERIAL      UNIQUE REFERENCES riddims (riddim_id),
    coverhash             VARCHAR(32) NOT NULL UNIQUE,
    cover                 BYTEA       NOT NULL,
    thumbnail             BYTEA       NOT NULL
);

Java で呼び出しているデータベース関数は次のようになります。

CREATE OR REPLACE FUNCTION add_cover(_riddim_id INT, _cover BYTEA, _thumbnail BYTEA) RETURNS INTEGER AS $$
DECLARE
    _cover_id INT;
BEGIN
    SELECT cover_id INTO _cover_id FROM covers WHERE riddim_id = _riddim_id;

    IF (_cover_id IS NULL) THEN
        INSERT INTO covers (riddim_id, coverhash, cover, thumbnail) VALUES (
            _riddim_id,
            md5(_cover),
            _cover,
            _thumbnail
        ) RETURNING cover_id INTO _cover_id;
    END IF;

    RETURN _cover_id;
END;
$$ LANGUAGE plpgsql;

JDBC コネクタを使用して上記のデータベース関数を呼び出すJava メソッドは次のようになります。

private int addCover(int riddim_id, byte[] cover, byte[] thumbnail) 
        throws SQLException {    
    int cover_id;

    try (CallableStatement cs = conn.prepareCall("{ ? = call add_cover(?, ?, ?) }")) {
        cs.registerOutParameter(1, Types.INTEGER);
        cs.setInt(2, riddim_id);
        cs.setBytes(3, cover);
        cs.setBytes(4, thumbnail);
        cs.execute();
        cover_id = cs.getInt(1);
    }

    return (cover_id != 0) ? cover_id : -1;
}

データを image/jpeg としてブラウザに送信するPHP スクリプト(Googleのどこかで見つけたもの):

<?php
  // Connect to the database
  $dbconn = pg_connect("<censored>");

  // Get the bytea data
  $res = pg_query("SELECT cover FROM covers WHERE cover_id = 11");
  $raw = pg_fetch_result($res, 'cover');

  // Convert to binary and send to the browser
  header('Content-type: image/jpeg');
  echo pg_unescape_bytea($raw);
?>

postgresql-9.4-1202.jdbc41.jarを使用して、 PostgreSQLバージョン 9.4.4 を実行しています。

4

1 に答える 1