0

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 を使用してファイル (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 オブジェクトからファイルを取得してデータベースに保存するにはどうすればよいですか?

4

2 に答える 2

2

使用している永続化 API が不明です。JDBC? JPA?古き良き冬眠?JDBCを想定しています。JDBC では、 を使用PreparedStatement#setBinaryStream()して をデータベースに格納しInputStreamたり、 をデータベースに格納したりできます。いずれにせよ、PostgreSQL では、このための列が必要です。PreparedStatement#setBytes()byte[]bytea

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

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

( IOUtilsApache Commons IO の一部です。FileUpload を使用している場合は、既に持っています)

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

PdfReader localPdfReader = new PdfReader(filecontent);

byteaiText で検証した後、次のように JDBC を使用して PostgreSQL 列に格納できます。

statement = connection.prepareStatement("INSERT INTO files (name, content) VALUES (?, ?)");
statement.setString(1, filename);
statement.setBytes(2, filecontent);
statement.executeUpdate();
于 2012-04-25T21:12:26.933 に答える
1

このフォーラムにも同様の質問があります。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();
于 2012-04-25T17:36:21.690 に答える