如何使用servlet在postgresql数据库中存储pdf文件?

时间:2012-04-25 16:41:25

标签: java file postgresql servlets

我正在从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 Servlet。在servlet中解析请求对象,并使用InputStream读取文件(pdf),如下面的代码所示。

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对象获取该文件以将其存储在数据库中?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

目前还不清楚您正在使用哪种持久性API。 JDBC? JPA?好的'Hibernate?我会假设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验证后,您可以使用JDBC将其存储在PostgreSQL bytea列中,如下所示:

statement = connection.prepareStatement("INSERT INTO files (name, content) VALUES (?, ?)");
statement.setString(1, filename);
statement.setBytes(2, filecontent);
statement.executeUpdate();