PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como armazenar um arquivo pdf no banco de dados postgresql usando servlets?


Não está claro qual API de persistência você está usando. JDBC? JPA? Bom e velho Hibernate? Vou assumir JDBC. Em JDBC, você pode usar PreparedStatement#setBinaryStream() para armazenar um InputStream no banco de dados ou PreparedStatement#setBytes() para armazenar um byte[] no banco de dados. De qualquer forma, no PostgreSQL você precisa de um bytea coluna para isso.

Como você está verificando o arquivo enviado por um PdfReader primeiro, o InputStream é inadequado. Pode ser lido apenas uma vez. O cliente não vai reenviar o arquivo várias vezes cada vez que você precisar ler o InputStream novamente. Você precisa copiar o InputStream para um byte[] primeiro.
ByteArrayOutputStream output = new ByteArrayOutputStream();
IOUtils.copy(localFileItem.getInputStream(), output);
byte[] filecontent = output.toByteArray();

(IOUtils faz parte do Apache Commons IO; se você estiver usando FileUpload, então você já o tem)

Não se esqueça de alterar o iText para usar o byte[] em vez de:
PdfReader localPdfReader = new PdfReader(filecontent);

Depois de validá-lo pelo iText, você pode armazená-lo em um PostgreSQL bytea coluna usando JDBC da seguinte forma:
statement = connection.prepareStatement("INSERT INTO files (name, content) VALUES (?, ?)");
statement.setString(1, filename);
statement.setBytes(2, filecontent);
statement.executeUpdate();