2013-02-23 2 views
3

Я пытаюсь сохранить изображения в базе данных MySQL из приложения Java swing. Я использую JFileChsoser, чтобы получить путь к изображению. Затем после этого конвертируйте файл, чтобы он мог быть сохранен в столбце MySQL, который имеет тип BLOB. Но каждое изображение, которое я пытаюсь сохранить, не сохраняется должным образом или неправильно преобразуется. Может ли кто-нибудь сказать мне, что я делаю неправильно здесь?Сохранение изображения в MySQL из Java

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

и я объявил переменную userimage и путь в качестве глобальных переменных

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

Это не очень хорошая практика, чтобы сохранить изображение как BLOB в базе данных MySQL. Сначала вы должны скопировать файл в этом случае в папку приложения, а затем просто сохранить путь к этому изображению в базе данных вместо изображения в виде BLOB. – dzeno

+0

Не храните изображения в БД. Вместо этого поместите их в папку и сохраните путь в БД. – Amarnath

+0

@dzeno Я делаю проект для университета. И я сделал точный способ, как вы только что сказали. Но друг ума непреклонен в сохранении изображений в базе данных MySQL. Так что она просто помогала ей. –

ответ

9

Вы преобразующих байт [] в строку в вашем SQL заявление, и вы будете в конечном итоге с неправильным данными ,

Правильный способ использования 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()); 

При получении его обратно вы можете так же получить InputStream от ResultSet:

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

Ах спасибо за подсказку. Теперь работает. Я сделал это. 'String sql =" вставить в imgtst (имя пользователя, изображение) значения (?,?) "; pst = con.prepareStatement (sql); String user = txt_username.getText(); pst.setString (1, пользователь); pst.setBytes (2, пользовательское изображение); pst.executeUpdate(); ' –

+0

Да, это тоже работает. Это немного медленнее, так как вы сначала читаете файл в массиве байтов, а затем снова читаете массив байтов, чтобы передать его в базу данных, и вы потребляете больше памяти, если файл большой, так как вам нужно сначала загрузить его , В то время как в моем примере это «трубопровод» через данные из файла в БД. Вы можете просто сохранить «File image» в качестве переменной-члена, установленной через 'btn_choosepicActionPerformed()', а затем в 'btn_saveActionPerformed()' вы открываете поток и отправляете его в базу данных. – jbx

Смежные вопросы