3

我正在使用 JSF2.0、码头服务器和 Postgres 数据库。我想以字节数组形式将 mp3 文件存储在数据库中。我上传了 mp3 文件的字节数组。但是当我从数据库中检索相同的字节数组时,我得到双倍大小的字节数组,因为我的 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 bytea 值将十六进制作为默认输出。所以,试试:

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 回答