Nie jest jasne, jakiego interfejsu API trwałości używasz. JDBC? JPA? Dobra, stara hibernacja? Zakładam JDBC. W JDBC możesz użyć PreparedStatement#setBinaryStream()
do przechowywania InputStream
w bazie danych lub PreparedStatement#setBytes()
do przechowywania byte[]
w bazie danych. Tak czy inaczej, w PostgreSQL potrzebujesz bytea
w tym celu.
Gdy weryfikujesz przesłany plik przez PdfReader
najpierw InputStream
jest nieodpowiedni. Można go przeczytać tylko raz. Klient nie wyśle ponownie pliku wielokrotnie za każdym razem, gdy będziesz musiał odczytać InputStream
ponownie. Musisz skopiować InputStream
do byte[]
pierwszy.
ByteArrayOutputStream output = new ByteArrayOutputStream();
IOUtils.copy(localFileItem.getInputStream(), output);
byte[] filecontent = output.toByteArray();
(IOUtils
jest częścią Apache Commons IO; jeśli używasz FileUpload, to już go masz)
Nie zapomnij zmienić iText, aby używał byte[]
zamiast tego:
PdfReader localPdfReader = new PdfReader(filecontent);
Po sprawdzeniu poprawności przez iText, możesz przechowywać je w bytea
PostgreSQL kolumna za pomocą JDBC w następujący sposób:
statement = connection.prepareStatement("INSERT INTO files (name, content) VALUES (?, ?)");
statement.setString(1, filename);
statement.setBytes(2, filecontent);
statement.executeUpdate();