2013-03-16 45 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