我正在从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对象获取该文件以将其存储在数据库中?
答案 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();