sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo almacenar un archivo pdf en la base de datos postgresql usando servlets?

No está claro qué API de persistencia estás usando. ¿JDBC? JPA? ¿Buen viejo Hibernate? Asumiré JDBC. En JDBC, puede usar PreparedStatement#setBinaryStream() para almacenar un InputStream en la base de datos, o PreparedStatement#setBytes() para almacenar un byte[] en la base de datos De cualquier manera, en PostgreSQL necesita un bytea columna para esto.

Mientras verifica el archivo cargado por un PdfReader primero, el InputStream es inadecuado. Es decir, solo se puede leer una vez. El cliente no volverá a enviar el archivo varias veces cada vez que necesite leer el InputStream otra vez. Necesitas copiar el InputStream a un byte[] primero.

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

(IOUtils es parte de Apache Commons IO; si está usando FileUpload, entonces ya lo tiene)

No olvide cambiar iText para usar el byte[] en cambio:

PdfReader localPdfReader = new PdfReader(filecontent);

Después de haberlo validado por iText, puede almacenarlo en un PostgreSQL bytea columna usando JDBC de la siguiente manera:

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