PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment stocker un fichier pdf dans une base de données postgresql à l'aide de servlets ?

L'API de persistance que vous utilisez n'est pas claire. JDBC ? JPA ? Bon vieux Hiberner ? Je suppose JDBC. Dans JDBC, vous pouvez utiliser PreparedStatement#setBinaryStream() pour stocker un InputStream dans la base de données, ou PreparedStatement#setBytes() pour stocker un byte[] dans la base de données. Quoi qu'il en soit, dans PostgreSQL, vous avez besoin d'un bytea colonne pour cela.

Pendant que vous vérifiez le fichier téléchargé par un PdfReader d'abord, le InputStream est inadapté. Il ne peut notamment être lu qu'une seule fois. Le client ne va pas renvoyer le fichier plusieurs fois à chaque fois que vous devez lire le InputStream encore. Vous devez copier le InputStream à un byte[] première.

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

(IOUtils fait partie d'Apache Commons IO ; si vous utilisez FileUpload, alors vous l'avez déjà)

N'oubliez pas de changer iText pour utiliser le byte[] à la place :

PdfReader localPdfReader = new PdfReader(filecontent);

Après l'avoir validé par iText, vous pouvez le stocker dans un bytea PostgreSQL colonne en utilisant JDBC comme suit :

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