无法恢复 URL 存储在 MySQL 数据库中
Unable To Recover URL Stored in MySQL database
我正在编写一个应用程序,将用户的头像存储在mysql数据库中,由于BLOB和CLOB数据类型带来的性能下降,我决定不使用它们,而是存储数据库 table 中的图像 url 作为 varchar 值。
问题是:当我尝试使用 ResultSet.getURL() 方法甚至 resultSet.getString() 检索 url 时。我收到 MalformedURLException- "Protocol :C not recognised"。我该如何解决这个问题,请帮忙。
这是我的代码;
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());
}
}
通过研究和实验,我发现当我使用
JFileChooser fileChooser = new JFileChooser();
fileChooser.getSelectedFile().getPath().toString();
这样发送到数据库的路径字符串是有效的url,因此我不需要更改正在使用 onRetrieve 的协议。
我正在编写一个应用程序,将用户的头像存储在mysql数据库中,由于BLOB和CLOB数据类型带来的性能下降,我决定不使用它们,而是存储数据库 table 中的图像 url 作为 varchar 值。
问题是:当我尝试使用 ResultSet.getURL() 方法甚至 resultSet.getString() 检索 url 时。我收到 MalformedURLException- "Protocol :C not recognised"。我该如何解决这个问题,请帮忙。
这是我的代码;
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());
}
}
通过研究和实验,我发现当我使用
JFileChooser fileChooser = new JFileChooser();
fileChooser.getSelectedFile().getPath().toString();
这样发送到数据库的路径字符串是有效的url,因此我不需要更改正在使用 onRetrieve 的协议。