반응형
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
반응형
'MySql' 카테고리의 다른 글
MySQL mysql에서 업데이트 된 행 선택 (0) | 2021.01.12 |
---|---|
MySQL 삽입 트리거 후 MySQL이 작동하지 않음 (0) | 2021.01.11 |
MySQL CodeIgniter에서 query () 및 limit () 메서드를 결합하는 방법 (0) | 2021.01.11 |
MySQL WHERE 절을 사용하는 여러 테이블이있는 MySQL UPDATE 구문 (0) | 2021.01.11 |
MySQL CF10, MYSQL SQL_SELECT_LIMIT = DEFAULT (0) | 2021.01.11 |
댓글