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();