Как сохранить файл pdf в базе данных postgresql с помощью сервлетов?
При отправке формы вызывается сервлет. Внутри сервлета объект запроса анализируется, и файл (pdf) считывается с использованием InputStream, как указано в коде ниже.
Как вы можете видеть, я использовал объект InputStream для проверки формата файла в формате pdf.
Теперь я хочу сохранить этот pdf файл в базе данных postgresql. В каком поле следует использовать postgresql и как я могу получить файл из объекта InputStream для его хранения в базе данных?
Непонятно, какой API устойчивости вы используете. JDBC? JPA? Хороший оливье? Я буду считать JDBC. В JDBC вы можете использовать PreparedStatement#setBinaryStream() для хранения InputStream в базе данных или PreparedStatement#setBytes() , чтобы сохранить byte[] в базе данных. В любом случае, в PostgreSQL вам понадобится bytea .
Когда вы сначала проверяете загруженный файл на PdfReader , InputStream не подходит. Его можно читать только один раз. Клиент не будет повторно отправлять файл несколько раз каждый раз, когда вам нужно снова прочитать InputStream . Сначала вам нужно скопировать InputStream в byte[] .
( IOUtils является частью Apache Commons IO, если вы используете FileUpload, то у вас уже есть)
Не забудьте изменить iText, чтобы вместо этого использовать byte[] :
После того, как вы подтвердили его с помощью iText, вы можете сохранить его в столбце PostgreSQL bytea , используя JDBC следующим образом:
В этом forum есть аналогичный вопрос.
Он использует изображение вместо pdf. Но процедура может быть одинаковой.
Сохраните поток в файл и сохраните его в базе данных.
Проверьте это. Может быть, может вам помочь.
Как сохранить файл pdf в базе данных postgresql с помощью сервлетов?
При отправке формы вызывается сервлет pdf. Внутри сервлета объект запроса анализируется, и файл (pdf) читается с использованием InputStream, как указано в коде ниже.
Как видите, я использовал объект InputStream для проверки формата файла как pdf.
Теперь я хочу сохранить этот PDF-файл в базе данных postgresql. Какое поле следует использовать в postgresql и как получить файл из объекта InputStream, чтобы сохранить его в базе данных?
2 ответа
Непонятно, какой API персистентности вы используете. JDBC? JPA? Старый добрый Hibernate? Я предполагаю, что JDBC. В JDBC вы можете использовать PreparedStatement#setBinaryStream() , чтобы сохранить InputStream в базе данных, или PreparedStatement#setBytes() , чтобы сохранить byte[] в базе данных. В любом случае в PostgreSQL вам понадобится bytea столбец для этого.
Поскольку вы сначала проверяете загруженный файл с помощью PdfReader , InputStream не подходит. А именно его можно прочитать только один раз. Клиент не собирается повторно отправлять файл несколько раз каждый раз, когда вам нужно будет снова прочитать InputStream . Сначала вам нужно скопировать InputStream в byte[] .
( IOUtils является частью Apache Commons IO; если вы используете FileUpload, значит, он у вас уже есть)
Не забудьте изменить iText, чтобы вместо него использовался byte[] :
После того, как вы проверили его с помощью iText, вы можете сохранить его в столбце PostgreSQL bytea с помощью JDBC следующим образом:
В этом форум. Он использует изображение вместо PDF. Но процедура может быть такой же. Сохраните поток в файл и сохраните его в базе данных. Проверить это. Может быть, смогу тебе помочь.
Проблема с загрузкой pdf в Postgres
Я пытаюсь сохранить документ в формате PDF в свою базу данных postgres 10.1, используя Hibernate. Ниже мой класс сущности.
Этот столбец имеет тип операции байта в базе данных postgres.
Как предложил Authur здесь: аналогичная проблема, я создал собственную реализацию диалекта postgres, как показано ниже.
Затем внутри моего файла persistence.xml я использую этот пользовательский диалект
Даже после всего этого я получаю ошибку ниже
Что еще мне нужно сделать, чтобы решить эту проблему?
Просто не надо. Сохраняйте свои большие двоичные файлы, используя базу данных, предназначенную для этой цели: файловая система. Затем сохраните имена файлов в своей БД.
@JonathonReinhart, а как бы вы это сделали?
@ Саймон Нет необходимости. Убедитесь, что файл существует на диске, а затем вставьте его в базу данных. Обратный порядок удаления. Если запросы всегда начинаются с базы данных, вы никогда не увидите запись без резервного файла.