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