2016-04-09 32 views
1

BLOB ve CLOB veri türleri tarafından getirilen performans geri yüklemeleri nedeniyle bir mysql veritabanındaki kullanıcıların profil görüntülerini depolayan bir uygulama yazıyorum, bunları kullanmamaya karar verdim, ancak Görüntü URL'sini veritabanı tablosunda varchar değerleri olarak saklamak.MySQL veritabanında depolanan URL Kurtarılamadı

Sorun şudur: ResultSet.getURL() yöntemini veya resultSet.getString() yöntemini kullanarak url'yi yeniden kullanmaya çalıştığımda. MalformedURLException - "Protokol: C tanınmadı" alıyorum. Bunu nasıl çözebilirim lütfen yardım edin.

İşte kodum;

araştırma ve deneylerle
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()); 
    } 
} 
+0

Hata iletisi, bir dosyanın konumunu, yerel bir dosya için mutlak yol olarak, örneğin, C: \ klasör \ ... 'sakladığınızı gösteriyor gibi görünüyor. Eğer öyleyse, muhtemelen onları URL olarak düşünmemelisiniz, sadece bunları veritabanında VARCHAR olarak saklayın ve bunlarla String değerleri olarak çalışın. –

+0

... Ayrıca, kodunuzdaki dinamik SQL'i değiştirmek için 'PreparedStatement' nesnelerini ve * parametreli sorguları * kullanmalısınız. –

cevap

0

, benim bulgular ben

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

O yolu kullandığınızda veritabanına gönderilen yol dizesi geçerli URL olduğunu ve kullanıyorum bu nedenle protokolü değiştirmek gerekmez onRetrieve.

+0

Dosya seçici, dizgi gösterimde gerçek dosya yolunu size verir –