Størrelsen på byte-array bliver dobbelt, når den hentes fra Postgres-databasen
Jeg bruger JSF2.0, jetty server og Postgres database. Jeg ønsker at gemme mp3-fil i databasen i byte array formet. Jeg uploader byte-arrayet af mp3-fil. Men når jeg henter samme byte-array fra databasen, får jeg byte-array af dobbelt størrelse, og derfor virker min mp3-fil ikke så godt.
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); }
Output:
Upload byte array størrelse:384440
Hentet byte array størrelse:768879
Jeg ved ikke hvorfor det sker. Jeg gemmer byte-array og på næste linje henter jeg den. Men jeg får byte-array af dobbelt størrelse. Sig til, hvis du har brug for flere detaljer.
Svar
Når man beskæftiger sig med binære data i Postgres, er det vigtigt at bruge korrekt databinding.
For det første skal datakolonnen være af typen BYTEA
. Er det tilfældet?
For at gemme data skal du bruge forberedte erklæringer og sørge for at ringe til 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();
For at hente data skal du også bruge forberedte udsagn og bruge 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();
Se mere her.