2016-04-09 5 views
0

こんにちは私は、Javaを使用して通常のWindowsディレクトリにあるファイルのURLを格納するアプリケーションを構築しています。ファイルはCドライブにあります。プログラムはfileChooserを使用して取得されたファイルのパスを取得し、path()は文字列にキャストされ、java.sql.PreparedStatement.setURL(fileChooser.getPath()。toString())を使用してSQLデータベースに格納されます。URLのプロトコルをC:からFile:に変更する

問題は次のとおりです。java.sql.ResultSet.getUrl(String columnName)を使用して、データベーステーブルからURLを回復しようとしたとき。私は例外が見つかりませんプロトコルを取得します。私は、指定されたディレクトリからプロフィール画像として画像や表示を回復するために使用することができます実際のURLに、データベースから取得した文字列を操作する方法の見当がつかない:ここ

は私のコードです:

public void addURLRow(String description, String url) 
     throws SQLException { 

    PreparedStatement pstmt = null; 

    try { 
     pstmt = this.sqlConnectionObject.prepareStatement(
       "INSERT INTO data_repository" 
       + "(document_name,url) VALUES (?,?)"); 

     pstmt.setString(1, description); 
     pstmt.setURL(2, new URL(url)); 
     pstmt.execute(); 
    } catch (SQLException sqlex) { 
     JOptionPane.showMessageDialog(null,sqlex); 
     // JDBCTutorialUtilities.printSQLException(sqlex); 
    } catch (Exception ex) { 
     System.out.println("Unexpected exception"); 
     JOptionPane.showMessageDialog(null,"ERROR"+ex.getMessage()); 
     // ex.printStackTrace(); 
    } finally { 
     if (pstmt != null) { 
      pstmt.close(); 
     } 
    } 
} 

//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; 
} 

//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()); 
       } 
+0

'url'列の型は何ですか?なぜデータを 'String'ではなく' URL'として保存していますか? – Titus

答えて

1

PreparedStatement.setURL()という値を格納しないでください。つまり、DB内部のSQL DATALINKが作成されます。通常の文字列として保存:

pstmt.setString(2, url) 

urlは、URLオブジェクトである場合urlがStringまたは

pstmt.setString(2, url.toExternalForm()) 

ある場合。読み返しをするときには、sのような変数の文字列値を読み込み、それから新しいURLオブジェクトを作成してください:

URL u = new URL(s) 
+0

URL文字列は、データベースに到達するまでに(/)が狂っていたが、あなたのメソッドはうまくいくまでには頓挫しました。 –

関連する問題