用于上传文件和文件夹的Java小程序,同时保持目录结构不变

时间:2011-06-23 18:33:46

标签: java file-upload applet sftp

以下代码用于将文件和文件夹上载到服务器(SFTP)。我试图保持文件夹结构完整,即C:\ temp \ test \ file.txt在服务器上变为/ home / www / javauploads / temp / test / file.txt 。但是当我运行它时,文件全部上传,但文件夹和文件只是在服务器上转储而没有任何结构,文件名看起来像这样(C3NXXV~9)有没有办法上传文件和文件夹,同时保持结构和文件名完整,谢谢。 `

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

}`

1 个答案:

答案 0 :(得分:0)

首先(与您的问题无关),您不应为每个文件或目录启动新会话和频道 - 打开会话和频道一次,并将其重新用于所有文件上传。这将更快,因为每个会话开放需要一些往返和一些复杂的加密计算。打开一个频道需要另一次往返。

然后,看看ChannelSftp.put(String)的工作原理。它将远程文件名作为参数,并返回一个OutputStream,然后您可以在其中编写数据。您没有使用OutputStream,这意味着不会真正上传。

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

此外,可能存在dir.toString()在本地命名约定中返回文件名(即在Windows系统上由\分隔)的问题,而您需要以{{1}分隔的名称}。我认为你可以使用一个简单的/

这并没有真正解释你的观察结果 - 你在哪个SSH服务器上使用哪个系统?