PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm thế nào để lưu trữ một tệp pdf trong cơ sở dữ liệu postgresql bằng cách sử dụng servlet?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Từ Now () đến Current_timestamp trong Postgresql

  2. Chuyển đổi Django từ SQLite sang PostgreSQL

  3. Không tìm thấy lệnh testing.postgresql:initdb inside docker

  4. Tạo một DB postgresql bằng psycopg2

  5. Phiên bản hạt nhân PostgreSQL so với Linux