Không rõ bạn đang sử dụng API liên tục nào. JDBC? JPA? Good ol 'Hibernate? Tôi sẽ đảm nhận JDBC. Trong JDBC, bạn có thể sử dụng PreparedStatement#setBinaryStream()
để lưu trữ một InputStream trong cơ sở dữ liệu hoặc PreparedStatement#setBytes()
để lưu trữ một byte[] trong cơ sở dữ liệu. Dù bằng cách nào, trong PostgreSQL, bạn cần có bytea
cột này.
Khi bạn đang xác minh tệp được tải lên bằng PdfReader đầu tiên, InputStream là không phù hợp. Nó chỉ có thể được đọc một lần. Máy khách sẽ không gửi lại tệp nhiều lần mỗi khi bạn cần đọc InputStream lại. Bạn cần sao chép InputStream thành một byte[] Đầu tiên.
ByteArrayOutputStream output = new ByteArrayOutputStream();
IOUtils.copy(localFileItem.getInputStream(), output);
byte[] filecontent = output.toByteArray();
(IOUtils là một phần của Apache Commons IO; nếu bạn đang sử dụng FileUpload, thì bạn đã có nó)
Đừng quên thay đổi iText để sử dụng byte[] thay vào đó:
PdfReader localPdfReader = new PdfReader(filecontent);
Sau khi bạn đã xác thực nó bằng iText, bạn có thể lưu trữ nó trong một PostgreSQL bytea cột sử dụng JDBC như sau:
statement = connection.prepareStatement("INSERT INTO files (name, content) VALUES (?, ?)");
statement.setString(1, filename);
statement.setBytes(2, filecontent);
statement.executeUpdate();