PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come archiviare un file pdf nel database postgresql utilizzando i servlet?

Non è chiaro quale API di persistenza stai utilizzando. JDBC? APP? Il buon vecchio letargo? Presumo JDBC. In JDBC, puoi utilizzare PreparedStatement#setBinaryStream() per memorizzare un InputStream nel database o PreparedStatement#setBytes() per memorizzare un byte[] nella banca dati. Ad ogni modo, in PostgreSQL è necessario un bytea colonna per questo.

Mentre stai verificando il file caricato con un PdfReader prima, il InputStream non è adatto. Può essere letto solo una volta. Il client non invierà nuovamente il file più volte ogni volta che devi leggere InputStream ancora. Devi copiare InputStream a un byte[] primo.

ByteArrayOutputStream output = new ByteArrayOutputStream();
IOUtils.copy(localFileItem.getInputStream(), output);
byte[] filecontent = output.toByteArray();

(IOUtils fa parte di Apache Commons IO; se stai usando FileUpload, lo hai già)

Non dimenticare di modificare iText per utilizzare il byte[] invece:

PdfReader localPdfReader = new PdfReader(filecontent);

Dopo averlo convalidato da iText, puoi archiviarlo in un bytea PostgreSQL colonna utilizzando JDBC come segue:

statement = connection.prepareStatement("INSERT INTO files (name, content) VALUES (?, ?)");
statement.setString(1, filename);
statement.setBytes(2, filecontent);
statement.executeUpdate();