Вопрос:
Я загружаю файл из HTML
<center><form action=»pdf» method=»post» enctype=»multipart/form-data»> <b>Upload Certificate</b> <input type=»file» name=»file»/></center> <center> <input type=»submit» /></center> </form>
При отправке формы вызывается сервлет. Внутри сервлета объект запроса анализируется, и файл (pdf) считывается с использованием InputStream, как указано в коде ниже.
protected void doPost(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse) throws ServletException, IOException { try { List localList = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(paramHttpServletRequest); for (FileItem localFileItem : localList) { String str1 = localFileItem.getFieldName(); String str2 = FilenameUtils.getName(localFileItem.getName()); System.out.println(«fieldname:» + str1); System.out.println(«filename:» + str2); InputStream localInputStream = localFileItem.getInputStream(); try { PdfReader localPdfReader = new PdfReader(localInputStream); paramHttpServletResponse.sendRedirect(«takedetails.jsp»); } catch (InvalidPdfException localInvalidPdfException) { paramHttpServletResponse.sendRedirect(«upload.jsp»); } } } catch (FileUploadException localFileUploadException) { throw new ServletException(«Cannot parse multipart request.», localFileUploadException); } }
Как вы можете видеть, я использовал объект InputStream для проверки формата файла в формате pdf.
Теперь я хочу сохранить этот pdf файл в базе данных postgresql. В каком поле следует использовать postgresql и как я могу получить файл из объекта InputStream для его хранения в базе данных?
Лучший ответ:
Непонятно, какой API устойчивости вы используете. JDBC? JPA? Хороший оливье? Я буду считать JDBC. В JDBC вы можете использовать PreparedStatement#setBinaryStream() для хранения InputStream в базе данных или PreparedStatement#setBytes(), чтобы сохранить byte[] в базе данных. В любом случае, в PostgreSQL вам понадобится bytea.
Когда вы сначала проверяете загруженный файл на PdfReader, InputStream не подходит. Его можно читать только один раз. Клиент не будет повторно отправлять файл несколько раз каждый раз, когда вам нужно снова прочитать InputStream. Сначала вам нужно скопировать InputStream в byte[].
ByteArrayOutputStream output = new ByteArrayOutputStream(); IOUtils.copy(localFileItem.getInputStream(), output); byte[] filecontent = output.toByteArray();
(IOUtils является частью Apache Commons IO, если вы используете FileUpload, то у вас уже есть)
Не забудьте изменить iText, чтобы вместо этого использовать byte[]:
PdfReader localPdfReader = new PdfReader(filecontent);
После того, как вы подтвердили его с помощью iText, вы можете сохранить его в столбце PostgreSQL bytea, используя JDBC следующим образом:
statement = connection.prepareStatement(«INSERT INTO files (name, content) VALUES (?, ?)»); statement.setString(1, filename); statement.setBytes(2, filecontent); statement.executeUpdate(); Ответ №1
В этом forum есть аналогичный вопрос.
Он использует изображение вместо pdf. Но процедура может быть одинаковой.
Сохраните поток в файл и сохраните его в базе данных.
Проверьте это. Может быть, может вам помочь.
For example, suppose you have a table containing the file name of an image and you also want to store the image in a bytea column: CREATE TABLE images (imgname text, img bytea); To insert an image, you would use: File file = new File(«myimage.gif»); FileInputStream fis = new FileInputStream(file); PreparedStatement ps = conn.prepareStatement(«INSERT INTO images VALUES (?, ?)»); ps.setString(1, file.getName()); ps.setBinaryStream(2, fis, file.length()); ps.executeUpdate(); ps.close(); fis.close();