3

Java swing アプリケーションから 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;
4

1 に答える 1

11

SQLステートメントでbyte[]を文字列に変換していると、誤ったデータになってしまいます。

BLOBを使用する正しい方法は、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); 
于 2013-02-23T01:39:09.573 に答える