PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie speichere ich eine PDF-Datei in der Postgresql-Datenbank mit Servlets?

Es ist unklar, welche Persistenz-API Sie verwenden. JDBC? JPA? Der gute alte Winterschlaf? Ich gehe von JDBC aus. In JDBC können Sie PreparedStatement#setBinaryStream() um einen InputStream zu speichern in der Datenbank oder PreparedStatement#setBytes() um ein byte[] zu speichern in der Datenbank. So oder so, in PostgreSQL benötigen Sie ein bytea Spalte dafür.

Während Sie die hochgeladene Datei mit einem PdfReader überprüfen zuerst der InputStream ist ungeeignet. Es kann nämlich nur einmal gelesen werden. Der Client wird die Datei nicht jedes Mal erneut senden, wenn Sie den InputStream lesen müssen wieder. Sie müssen den InputStream kopieren zu einem byte[] Erste.

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

(IOUtils ist Teil von Apache Commons IO; wenn Sie FileUpload verwenden, haben Sie es bereits)

Vergessen Sie nicht, iText so zu ändern, dass byte[] verwendet wird stattdessen:

PdfReader localPdfReader = new PdfReader(filecontent);

Nachdem Sie es von iText validiert haben, können Sie es in einem PostgreSQL bytea speichern Spalte mit JDBC wie folgt:

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