3

JSF2.0、jetty サーバー、および Postgres データベースを使用しています。mp3ファイルをバイト配列形式でデータベースに保存したい。mp3 ファイルのバイト配列をアップロードします。しかし、データベースから同じバイト配列を取得すると、2倍のサイズのバイト配列が取得され、そのためmp3ファイルも機能しません。

public void updateAnnouncementDetail(AnnouncementDetail announcementDetail) {
    System.out.println("Upload  byte array size:" + announcementDetail.getContent().length);
    Session sess=get Session();
    sess.beginTransaction();
    sess.save(announcementDetail);
    sess.getTransaction().commit();
    AnnouncementDetail detail;
    detail = retrieveAnnouncementDetailById(new AnnouncementDetailPK(announcementDetail.getAnnouncementDetailPK().getAnnouncement(), announcementDetail.getAnnouncementDetailPK().getLanguage()));
    System.out.println("Retrived byte array size:" + detail.getContent().length);
}

出力:

アップロードバイト配列サイズ:384440

取得したバイト配列サイズ:768879

なぜそれが起こっているのかわかりません。バイト配列を保存していて、次の行でそれを取得しています。しかし、倍のサイズのバイト配列を取得します。詳細が必要な場合はお知らせください。

4

2 に答える 2

10

Postgres 9.x のバイト値には、デフォルトの出力として 16 進数があります。だから、試してみてください:

ALTER DATABASE database_name SET bytea_output = 'escape';

于 2013-02-17T15:33:36.657 に答える
5

Postgres でバイナリ データを扱う場合、適切なデータ バインディングを使用することが重要です。

まず、データ列は型でなければなりませんBYTEA。そうですか?

データを保存するには、準備されたステートメントを使用し、必ず次を呼び出しますsetBinaryStream()

File file = new File("myimage.gif");
FileInputStream fis = new FileInputStream(file);
PreparedStatement ps = conn.prepareStatement(
    "INSERT INTO images VALUES (?, ?)"
);
ps.setString(1, file.getName());
ps.setBinaryStream(2, fis, (int)file.length());
ps.executeUpdate();
ps.close();
fis.close();

データを取得するには、準備済みステートメントも使用し、次を使用しますgetBytes()

PreparedStatement ps = conn.prepareStatement(
    "SELECT img FROM images WHERE imgname = ?"
);
ps.setString(1, "myimage.gif");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
    byte[] imgBytes = rs.getBytes(1);
    // use the data in some way here
}
rs.close();
ps.close();

詳しくはこちらをご覧ください

于 2012-11-27T10:19:08.180 に答える