2011-06-23 70 views
1

以下代码用于上传文件和文件夹到服务器(SFTP)。我努力保持文件夹结构完整,即C:\ temp \ test \ file.txt成为/ home/www/javauploads/temp/test/file.txt在服务器上。但是当我运行它的文件都上传,但文件夹和文件只是倾倒在服务器上没有任何结构,文件名像这样出现(C3NXXV〜9)有没有办法上传文件和文件夹,同时保持结构和文件名完好无损,谢谢。 `Java applet上传文件和文件夹,同时保持目录结构完好

private static void processDir(File dir) throws JSchException, SftpException { 
    String SFTPHOST = "*****.com"; 
    int SFTPPORT = ***; 
    String SFTPUSER = "****"; 
    String SFTPPASS = "*****"; 
    String SFTPWORKINGDIR = "/home/www/javauploads/";`Session  session  = null; 
    Channel  channel  = null; 
    ChannelSftp channelSftp = null; 
    JSch jsch = new JSch(); 
    session = jsch.getSession(SFTPUSER,SFTPHOST,SFTPPORT); 
    session.setPassword(SFTPPASS); 
    java.util.Properties config = new java.util.Properties(); 
    config.put("StrictHostKeyChecking", "no"); 
    session.setConfig(config); 
    session.connect(); 

    channel = session.openChannel("sftp"); 
    channel.connect(); 
    channelSftp = (ChannelSftp)channel; 
    channelSftp.cd(SFTPWORKINGDIR); 


    if (dir.isDirectory()){ 
     channelSftp.mkdir(dir.toString()); 
     System.out.println("[Directory] : " + dir); 
    }else{ 
     channelSftp.put(dir.toString()); 
     System.out.println("[File] : " + dir); 
    } 
    channelSftp.exit(); 
    session.disconnect(); 
} 

private static void traverse(File dir) throws JSchException, SftpException { 

    processDir(dir); 

    if (dir.isDirectory()) { 
     String[] children = dir.list(); 
     for (int i = 0; i < children.length; i++) { 
      traverse(new File(dir, children[i])); 
     } 
    } 

}` 
+0

这个问题仍然存在吗?如果是这样,它可能有助于了解客户端和服务器系统以及SSH服务器。如果没有,请发布您找到的解决方案。 –

回答

0

优先(无关你的问题),你不应该开始为每个文件或目录的新会话和渠道 - 打开会话和渠道一次,并重新使用它为所有的文件上传。这将会快得多,因为每次会话都需要一些往返和一些复杂的密码计算。打开一个频道需要另一次往返。

然后,看看ChannelSftp.put(String)如何工作。它将远程文件名称作为参数,并返回一个OutputStream,然后可以写入您的数据。你没有使用OutputStream,这意味着没有真正的上传。

我想你想ChannelSftp.put(String, String) - 这将采取本地和远程文件名,并上传本地文件的内容,创建一个远程文件(或覆盖它,如果它已经存在)。

此外,还有可能是dir.toString()返回本地命名约定文件名(即由\在Windows系统中分离)的问题,而你需要/分隔的名称。我想你可以使用简单的.replace('\\', '/')

这并不能真正解释你的观察,尽管 - 你在哪个SSH服务器上使用系统?

+0

客户端是服务器是bsd的Windows机器。谢谢 – Arphadax

相关问题