3

postgresql テーブルのフィールドの 1 つに画像を挿入する方法を知りたいです。この問題に関する適切なチュートリアルが見つかりません。フィールドのデータ型は ですoid。誰もこれを試しましたか?ありがとう!

4

3 に答える 3

3
// All LargeObject API calls must be within a transaction
conn.setAutoCommit(false);

// Get the Large Object Manager to perform operations with
LargeObjectManager lobj = ((org.postgresql.PGConnection)conn).getLargeObjectAPI();

//create a new large object
int oid = lobj.create(LargeObjectManager.READ | LargeObjectManager.WRITE);

//open the large object for write
LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE);

// Now open the file
File file = new File("myimage.gif");
FileInputStream fis = new FileInputStream(file);

// copy the data from the file to the large object
byte buf[] = new byte[2048];
int s, tl = 0;
while ((s = fis.read(buf, 0, 2048)) > 0)
{
        obj.write(buf, 0, s);
        tl += s;
}

// Close the large object
obj.close();

//Now insert the row into imagesLO
PreparedStatement ps = conn.prepareStatement("INSERT INTO imagesLO VALUES (?, ?)");
ps.setString(1, file.getName());
ps.setInt(2, oid);
ps.executeUpdate();
ps.close();
fis.close();

hereからそのサンプルコードを見つけました。SQL操作の本当に非常に優れた束。

于 2012-07-02T06:50:36.977 に答える
2

このサイトを引用するには、

PostgreSQL データベースには、bytea と呼ばれるバイナリ データを格納するための特別なデータ型があります。これは非標準のデータ型です。データベースの標準データ型は BLOB です。

たとえば、画像ファイルを読み取るクライアントを作成する必要があります。

File img = new File("woman.jpg");
fin = new FileInputStream(img);

con = DriverManager.getConnection(url, user, password);

pst = con.prepareStatement("INSERT INTO images(data) VALUES(?)");
pst.setBinaryStream(1, fin, (int) img.length());
pst.executeUpdate();
于 2012-07-02T06:53:22.767 に答える
1

byteaタイプまたはラージ オブジェクト機能のいずれかを使用できます。ただし、ユースケースによっては、DB サーバーに追加の負荷がかかる可能性があるため、画像を DB に配置することはお勧めできません。

あなたの質問を読み直すと、タイプ oid のフィールドがあることに気づきました。これが変更中のアプリケーションである場合、大きなオブジェクトを使用していることを示唆しています。これらのオブジェクトは、それらを追跡するために別のテーブルに格納する必要がある oid を取得します。

于 2012-07-02T06:57:31.633 に答える