본문 바로가기
MySql

MySQL Java에서 MySQL에 이미지 저장

by 베이스 공부 2021. 1. 11.
반응형

Java 스윙 응용 프로그램에서 MySQL 데이터베이스에 이미지를 저장하려고합니다. 이미지 경로를 가져 오기 위해 JFileChsoser를 사용하고 있습니다. 그런 다음 BLOB 유형의 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);
    }     
}

그리고이 후에 저는 이렇게 데이터베이스에 저장합니다.

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);
    }  
}

그리고 userimage 및 path 변수를 전역 변수로 선언했습니다.

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

 

해결 방법

 

SQL 문에서 byte []를 문자열로 변환하면 잘못된 데이터가 생성됩니다.

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

 

참조 페이지 https://stackoverflow.com/questions/15035883

 

 

반응형

댓글