1

我正在编写一个将用户的个人资料图像存储在 mysql 数据库中的应用程序,由于 BLOB 和 CLOB 数据类型带来的性能回退,我决定不使用它们,而是将图像 url 存储在数据库表中作为 varchar价值观。

这是问题所在:当我尝试使用 ResultSet.getURL() 方法甚至 resultSet.getString() 检索 url 时。我收到 MalformedURLException-“无法识别协议:C”。我该如何解决这个问题请帮忙。

这是我的代码;

 try {
        sqlConnectionObject = DriverManager.getConnection(jdbcUrl,"root","");
    } catch (SQLException ex) {
        Logger.getLogger(Androbot.class.getName()).log(Level.SEVERE, null, ex);
    }
    fileChooser = new JFileChooser();
    FileFilter fileFilter = new FileNameExtensionFilter("pic", "jpg");
    fileChooser.addChoosableFileFilter(fileFilter);

    obtainURLFromDBButton.addActionListener(
            new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            try {
                JOptionPane.showMessageDialog(null, obtainImageUrl("userName"));
                File file = new File(obtainImageUrl("userName").toString()); //the obtain image url 
                                                                             //function is called  here
                                                                             //and passed to File
                                                                             //file is used to creat image
                Image img = ImageIO.read(file);
                thisButton.setIcon(new ImageIcon(img));
            } catch (FileNotFoundException e) {
                JOptionPane.showMessageDialog(null, "ERROR" + e.getMessage());
            } catch (IOException e) {
                JOptionPane.showMessageDialog(null, "ERROR" + e.getMessage());
            }
        }
    }
    );

//Allows user to set profile
    addImagButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            int ret = fileChooser.showDialog(null, "Add Profile Picture");
            if (ret == JFileChooser.APPROVE_OPTION) {
                // fileChooser.getSelectedFile().getPath();
                try {
                    // file = new File("C:\\Users\\user\\Pictures\\EmmaBeib\\12553040_133350150376029_4407158756206009973_n.jpg");
                    String fileUrl = fileChooser.getSelectedFile().getPath();
                    JOptionPane.showMessageDialog(null,"URL = "+fileUrl);
                    addURLRow("userName", fileUrl);
                    image = ImageIO.read(fileChooser.getSelectedFile());

                    addImagButton.setIcon(new ImageIcon(image));
                  //  addPictureToDB(fileChooser.getSelectedFile());
                } catch (FileNotFoundException e) {
                    System.err.println(e);
                } catch (IOException e) {
                    System.out.println(e);
                }catch(SQLException e){
                    JOptionPane.showMessageDialog(null,"ERROR"+e.getMessage());
                }

            } else if (ret == JFileChooser.CANCEL_OPTION) {
                int opt = JOptionPane.showConfirmDialog(null, "Apopprove cancel?", "", JOptionPane.OK_CANCEL_OPTION);
                if (opt == JOptionPane.CANCEL_OPTION) {
                    fileChooser.showDialog(null, "Add Profile Picture");
                }
            } else if (ret == JFileChooser.ERROR_OPTION) {
                JOptionPane.showMessageDialog(null, "An ERROR occured try again later");

            }
        }
    }
    );

//Obtain picture from the database
public Object obtainImageUrl(String userName) throws MalformedURLException {
    try (Connection connect = DriverManager.getConnection("jdbc:mysql://localhost:3306/picturedb", "root", "")) {
        Statement mysqlStm = connect.createStatement();
        String SELECT_QUERY = "SELECT * FROM picture WHERE userName IN ('" + userName + "');";
        ResultSet cursor = mysqlStm.executeQuery(SELECT_QUERY);
        while (cursor.next()) {
            imageUrl = cursor.getObject("picUrl");
        }
        URL url = new URL(imageUrl.toString());
        // File imageFile = new File(imageUrl);
        try {
            Image img = ImageIO.read(url);

        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "ERROR" + ex.getMessage());
        }

    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, "ERROR" + e.getMessage());
    }
    return imageUrl;
}
 //insert image url in the db
public void addPictureToDB(File file) {
    imageUrl = file.getAbsolutePath();
    try (Connection connect = DriverManager.getConnection(jdbcUrl, "root", "")) {
        Statement mysqlStmt = connect.createStatement();
        String INSERT_QUERY = "INSERT INTO picture VALUES('"
                + imageUrl + "','"
                + "BETTY KIPPO');";
        mysqlStmt.execute(INSERT_QUERY);
        JOptionPane.showMessageDialog(null, "Image Added Succefully");
    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, "ERROR" + e.getMessage());
    }
}
4

1 回答 1

0

通过研究和实验,我的发现是,当我使用

JFileChooser fileChooser = new JFileChooser();
fileChooser.getSelectedFile().getPath().toString();

这样发送到数据库的路径字符串是有效的 url,因此我不需要更改使用 onRetrieve 的协议。

于 2016-04-19T11:56:58.103 回答