【问题标题】:File uploading and downloading via remote method invocation通过远程方法调用文件上传和下载
【发布时间】:2013-03-16 14:30:41
【问题描述】:

我整天都在研究我的客户如何从服务器数据库上传和下载文件。当服务器和客户端在同一台机器上运行时,我的代码工作正常,但是当客户端和服务器在不同的机器上时,一切都搞砸了。这是我的学校项目,所以任何人都可以帮助我如何实施该计划应该做的事情。我在整个互联网上搜索和搜索,但由于我自己的努力,我没有找到解决方案,我看到了一些,但它们与 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();

}

这是我下载按钮的动作监听器:

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

我的数据库包含以下内容:

ID : 自动编号

文件名:文本

文件大小:OLE 对象

【问题讨论】:

  • 路径的值是多少?
  • 那么path的值就是数据库所在的路径。
  • 所有用户共享该文件并使用 UNC 路径访问该文件 :)

标签: java network-programming rmi


【解决方案1】:

您没有通过 rmi 实现远程文件加载,您已经实现了一个远程调用,它将数据库文件复制到本地文件系统(服务器的)。除非您的客户端有权访问服务器的文件系统,否则这是行不通的。您实际上需要通过 rmi 发送文件字节。

【讨论】:

  • 上传和下载都应该是字节[]编码?感谢赐教
  • @MaricrisCarbonel - 是的,这是简单的解决方案(对于家庭作业来说很好)。但是,对于生产代码,您永远不会想要这样做,因为它会导致大文件出现内存问题。您可以使用 rmiio 通过 rmi 流式传输数据,以获得更强大的实现。