开发一个通讯录,使用mySQL作为数据库,在处理人物头像时,无法把载入图片,mySQL字符集都是utf8,存储类型mediumblob
我试了两种方法,第一种是直接写路径             File file=new File("src\\image\\head.png");
                  FileInputStream fis=new FileInputStream(file);
                  ps.setBinaryStream(10, fis, (int)file.length());
 
第二种方法是使用filechooser选择路径
           File file = new File(m.getPicturePath());
           in = new FileInputStream(file);
           ps.setBinaryStream(10, in, (int) file.length());//其中m为另一个类
             
             //  getPicturePath()方法如下,就是通过文件选择器得到图片的绝对路径                          JFileChooser fileChooser = new JFileChooser(); // 创建文件对话框
                            // 创建文件过滤
                            FileFilter filter = new FileNameExtensionFilter(
                                    "图像文件(*.gif;*.jpg;*.jpeg;*.png)", "gif",
                                    "jpg", "jpeg", "png");
                            fileChooser.setFileFilter(filter); // 为文件对话框设置文件过滤器
                            int returnValue = fileChooser.showOpenDialog(null);// 打开文件选择对话框
                            if (returnValue == JFileChooser.APPROVE_OPTION) { // 判断是否选择了文件
                               String name=fileChooser.getSelectedFile().getPath();
                               ImageIcon icon=new ImageIcon(name);
                               
                               //等比缩放条件
                               int imgWidth=icon.getIconWidth();
                               int imgHeight=icon.getIconHeight();
                               int conWidth=lbl_picture.getWidth();
                               int conHeight=lbl_picture.getHeight();
                               int reImgWidth;
                               int reImgHeight;
                               if(imgWidth/imgHeight>=conWidth/conHeight){
                                
                                 if(imgWidth>conWidth){
                                 reImgWidth=conWidth;
                                 reImgHeight=imgHeight*reImgWidth/imgWidth;
                                 }else{
                                 reImgWidth=imgWidth;
                      reImgHeight=imgHeight;                                 }
                              
                               }else{
                                if(imgWidth>conWidth){
             reImgHeight=conHeight;
             reImgWidth=imgWidth*reImgHeight/imgHeight;
                          }else{
                                reImgWidth=imgWidth;
                        reImgHeight=imgHeight;
                     }                               }
                                File file = fileChooser.getSelectedFile(); // 获得文件对象
                                picturePath = file.getAbsolutePath();运行结果You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\"?‘?O?z?xb:???XF??!?^\'_???$è“?é?·
!%?I IkHè·?-???i?·?&é?…mè????????????…' at line 1
确实是乱码,这个乱码看起来应该是路径的,因为我选择不同的图片时,这个乱码的长度不一样现在很困惑,希望能在这里遇到高手

解决方案 »

  1.   

    mysql处理二进制数据确实比较困难。
    一般我们的做法是数据库里面存放磁盘地址,实际文件存放在磁盘中。
    如果你非要把二进制文件存放入数据库,而数据库又不支持二进制文件存放的时候,可以用一个很蛋疼的方式,就是把二进制数据作64位字符编码,把它变成字符存放入数据库,下次取出来要解码,不过这样存储数据量会成倍增长,有编码与解码过程,对系统速度造成较大影响。
      

  2.   

    保存图片,楼主首先要解释清楚,图片的数据最终是要保存到硬盘上,还是数据库中 ?
    看样子是保存到数据库中,那么,数据库建表的时候,对于数据的字段应该是Blob类型。
    文件的路径,保存到varchar类型的字段里面。
    Blob类型,不能像基本类型那样操作,它的内容是以流的形式来存取的。抛那个异常的原因,表面上看是SQL语句不正确。
    楼主在插入Blob类型数据的时候,
    最保险的方法是,
    1.先插入一个空的blob数据,(不同数据库有对应的内置函数可以调用,像时间函数一样)
    2.select for update将插入的数据查询出来
    3.将查询的Blob数据进行更新操作。
    4.提交数据库事务。
      

  3.   

    我是想把路径保存在数据库中,图片放在硬盘里面。mySQL的类型我已经设置为longblob类型了啊