2012-04-25 20 views
0

は私がフォームを送信で サーブレットを使用してpostgresqlデータベースにpdfファイルを保存する方法は?

<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> 

HTML
からファイルをアップロードしています、PDFサーブレットが呼び出されます。サーブレットの内部では、要求オブジェクトが解析され、ファイル(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オブジェクトからファイルを取得する方法はありますか?

答えて

1

使用しているパーシステンスAPIが不明です。 JDBC? JPA?グッドオール 'ハイバネーション?私はJDBCを想定します。 JDBCではPreparedStatement#setBinaryStream()を使用してInputStreamをデータベースに格納します。PreparedStatement#setBytes()を格納してbyte[]をデータベースに格納することができます。いずれにしても、PostgreSQLではbyteaカラムが必要です。

アップロードしたファイルをPdfReaderで最初に確認しているので、InputStreamは不適切です。つまり、一度だけ読み取ることができます。 InputStreamを再度読み取る必要があるたびに、クライアントはファイルを複数回再送信しません。最初にInputStreambyte[]にコピーする必要があります。

ByteArrayOutputStream output = new ByteArrayOutputStream(); 
IOUtils.copy(localFileItem.getInputStream(), output); 
byte[] filecontent = output.toByteArray(); 

IOUtilsは、Apache CommonsのIOの一部であり、あなたがするFileUploadを使用している場合、あなたはすでにそれを持っている)

代わりbyte[]を使用するようにiTextのを変更することを忘れないでください。

あなたはiTextのことで、それを検証した後、次のように
PdfReader localPdfReader = new PdfReader(filecontent); 

、あなたはJDBCを使用してPostgreSQLのbytea列に格納することができます。

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

メモリ内のバイト[]を使用する代わりに、一時的なファイル、またはインメモリバッファから一時的なファイルに切り替えることを知っているスマートバッファクラスを使用することを検討してください。また、おそらくあなたにとって重要ではありませんが、byteaは1GBに制限されています。大きなファイルの場合は、DBの外にそれらを格納し、パスとチェックサムだけを格納します。 –

+0

@BalusCありがとうございます:)それはちょうど完璧な答えでした。私はちょうど小さな最終的な疑いを持っています。検索中はバイナリデータを取得します。それをファイルに変換してそのPDFファイルを表示するには、どうすればよいですか? – suraj

+0

'ResultSet#getBinaryStream()'を使用して、DBから 'InputStream'として取得します。それをダウンロードとして提供しますか?適切なレスポンスヘッダに沿って 'HttpServletResponse#getOutputStream()'に書き込むだけで、ブラウザが何をするべきかを理解できるようになります。ファイルとして保存しますか? 'new FileOutputStream()'に書き出してください。 Etcetera。あなたのフレーバーに 'OutputStream'を書くだけです。 http://stackoverflow.com/questions/4614935/how-to-display-a-pdf-file-in-jsp-using-servlet/4615155#4615155 – BalusC

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

私も上記のコードを見ました。私は自分のコードでこの文のInputStreamオブジェクト "localInputStream"かどうか疑問がありますInputStream localInputStream = localFileItem.getInputStream();ファイルをデータベースに保存するには十分ですか?変換を行う必要はありますか? – suraj

関連する問題