2013-02-23 5 views
3

Java Swing 응용 프로그램에서 MySQL 데이터베이스에 이미지를 저장하려고합니다. JFileChsoser를 사용하여 이미지의 경로를 얻습니다. 그런 다음 파일을 변환하여 BLOB 유형 인 MySQL 열에 저장할 수 있습니다. 그러나 저장하려고하는 모든 이미지가 제대로 저장되지 않거나 제대로 변환되지 않습니다. 누군가 내가 여기서 잘못하고있는 걸 말해 줄 수 있니?Java에서 MySQL에 이미지 저장

private void btn_choosepicActionPerformed(java.awt.event.ActionEvent evt) { 
    JFileChooser picchooser = new JFileChooser(); 
    picchooser.setDialogTitle("Select Image"); 
    picchooser.showOpenDialog(null); 
    File pic=picchooser.getSelectedFile(); 
    path= pic.getAbsolutePath(); 
    txt_path.setText(path.replace('\\','/')); 
    try{ 
     File image = new File(path); 
     FileInputStream fis = new FileInputStream(image); 
     ByteArrayOutputStream baos= new ByteArrayOutputStream(); 
     byte[] buff = new byte[1024]; 
     for(int readNum; (readNum=fis.read(buff)) !=-1 ;){ 
      baos.write(buff,0,readNum); 
     } 
     userimage=baos.toByteArray(); 
    } 
    catch(Exception e){ 
     JOptionPane.showMessageDialog(null, e); 
    }  
} 

그리고 나서이 Im을 데이터베이스에 저장합니다.

private void btn_saveActionPerformed(java.awt.event.ActionEvent evt) { 
    String user= txt_username.getText(); 
    try{ 
     String sql="insert into imgtst (username,image) values ('"+user+"','"+userimage+"')"; 
     pst=con.prepareStatement(sql); 
     pst.executeUpdate(); 
     JOptionPane.showMessageDialog(null, "Saved"); 
    } 
    catch(Exception e){ 
     JOptionPane.showMessageDialog(null, e); 
    } 
} 

나는 당신은 당신의 SQL 문에서 문자열로 바이트 []를 변환하는 글로벌 변수

String path=null; 
byte[] userimage=null; 
+1

그것은 MySQL 데이터베이스에 BLOB로 저장 이미지에 좋은 방법이 아닙니다. 먼저 파일 (이 경우 이미지)을 응용 프로그램 폴더에 복사 한 다음 이미지 대신 BLOB로 데이터베이스에 이미지의 경로를 저장해야합니다. – dzeno

+0

DB에 이미지를 저장하지 마십시오. 대신 폴더에 저장하고 경로를 DB에 저장하십시오. – Amarnath

+0

@dzeno 나는 대학을위한 프로젝트를하고있다. 그리고 내가 방금 말한 것과 정확히 똑같이 했어. 그러나 마음의 친구는 MySQL 데이터베이스에 이미지를 저장하는 데 절대적인 입장입니다. 그래서 그녀를 돕는 것뿐이었습니다. –

답변

9

같은 변수 userimage과 경로를 선언하고 잘못된 데이터로 끝날 것 .

BLOB를 사용하는 올바른 방법은 InputStream을 전달하는 것입니다. 사용중인 FileInputStream을 사용하여 파일을 읽을 수 있습니다. 당신이 그것을 다시 검색 할 때

File image = new File(path); 
FileInputStream fis = new FileInputStream (image); 

String sql="insert into imgtst (username,image) values (?, ?)"; 
pst=con.prepareStatement(sql); 

pst.setString(1, user); 
pst.setBinaryStream (2, fis, (int) file.length()); 

당신은 유사 ResultSet에서 InputStream를 얻을 수 있습니다 :

InputStream imgStream = resultSet.getBinaryStream(2); 
+0

힌트를 주셔서 감사합니다. 그 지금 일하고있어. 나는 이걸했다. 'String sql = "imgtst (사용자 이름, 이미지) 값 (?,?)에 삽입"; pst = con.prepareStatement (sql); String user = txt_username.getText(); pst.setString (1, user); pst.setBytes (2, userimage); pst.executeUpdate(); ' –

+0

그래도 가능합니다. 첫 번째 파일을 바이트 배열로 읽은 다음 바이트 배열을 다시 읽어 데이터베이스에 전달하고 파일이 크면 더 많은 메모리를 사용하므로 처음에는로드해야하기 때문에 조금 느립니다. . 필자의 예제에서는 파일에서 DB 로의 데이터를 '파이핑'하는 동안. 'File image'를'btn_choosepicActionPerformed()'를 통해 멤버 변수로 설정 한 다음'btn_saveActionPerformed()'에서 스트림을 열고 데이터베이스로 보낼 수 있습니다. – jbx