2013-03-16 80 views
1

我花了一整天的時間工作並研究我的客戶端如何從服務器數據庫上載和下載文件。當服務器和客戶端運行在同一臺機器上時,我的代碼工作正常,但當客戶端在不同的機器上以及服務器上時,一切都搞砸了。這是我的學校項目,任何人都可以幫助我實施該計劃應該實現的目標。我在互聯網上搜索和搜索,爲了我自己的努力,我找不到解決方案,我看到了一些,但它們是與servlet和jsp相關的。我需要做一個桌面應用程序。有關我的代碼的一些信息在這裏。對於下載通過遠程方法調用文件上傳和下載

服務器實施:

public synchronized void downloadFile(Object row) throws RemoteException { 
    try { 
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
     String database = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ="+path+".accdb;"; 
     dbConn = DriverManager.getConnection(database, "", ""); 
     ps = dbConn.prepareStatement("SELECT * FROM File WHERE ID = ?"); 
     ps.setString(1, row.toString()); 
     ResultSet rs = ps.executeQuery(); 
     while (rs.next()) { 
      InputStream is; 
      FileOutputStream fos; 
      try { 
       is = rs.getBinaryStream("FileSize"); 
       fos = new FileOutputStream(new File("C:/" +rs.getString("FileName"))); 
       int bytesRead; 
       while ((bytesRead = is.read()) != -1) { 
        fos.write(c); 
       } 
       is.close(); 
       fos.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    ps.close(); 
    dBConn.close(); 

} 

這裏是我的下載按鈕的ActionListener:

if (source.equals(downloadB)) { 
      try { 
       if (fileTable.getSelectedRow() == -1) { 
        JOptionPane.showMessageDialog(null, "No file to be download", "Error", JOptionPane.ERROR_MESSAGE); 
       } else { 
        s.downloadFile(fileTable.getValueAt(fileTable.getSelectedRow(), 0)); 
        JOptionPane.showMessageDialog(null, "Download Successful", "Information", JOptionPane.INFORMATION_MESSAGE); 
       } 
      } catch (RemoteException re) { 
       JOptionPane.showMessageDialog(null, "Error downloading file", "Error", JOptionPane.ERROR_MESSAGE); 
      } 
     } 

我的數據庫containts如下:

ID:自動編號

文件名:文本

文件大小:OLE對象

+0

什麼是路徑的價值? – Sach 2013-03-16 14:41:09

+0

那麼路徑的值就是數據庫所在的路徑。 – 2013-03-16 14:47:36

+0

分享該文件的所有用戶,並使用UNC路徑來訪問文件:) – Sach 2013-03-16 14:49:21

回答

0

你是不是在執行RMI遠程文件加載,你已經實現了遠程調用,它拷貝數據庫文件到本地文件系統(服務器)。除非你的客戶端可以訪問服務器的文件系統,否則這是行不通的。你需要實際上發送 rmi上的文件字節。

+0

上傳和下載都應該在字節[]編碼?感謝啓發 – 2013-03-16 14:37:46

+0

@MaricrisCbonbonel - 是的,這是簡單的解決方案(這對於作業來說很好)。但是,對於生產代碼,您將永遠不想這樣做,因爲這會導致大文件的內存問題。您可以使用[rmiio](http://openhms.sourceforge.net/rmiio/)通過rmi傳輸數據以獲得更強大的實現。 – jtahlborn 2013-03-16 16:25:14