2012-04-25 6 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는 아파치 코 몬즈 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()'에 써주세요. 기타. 그냥 당신의 취향에 어떤'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

관련 문제