Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java小程序,用于上载文件和文件夹,同时保持目录结构完整_Java_File Upload_Applet_Sftp - Fatal编程技术网

Java小程序,用于上载文件和文件夹,同时保持目录结构完整

Java小程序,用于上载文件和文件夹,同时保持目录结构完整,java,file-upload,applet,sftp,Java,File Upload,Applet,Sftp,以下代码用于将文件和文件夹上载到服务器SFTP。我试图保持文件夹结构完整,即服务器上的C:\temp\test\file.txt变为/home/www/javauploads/temp/test/file.txt。但是当我运行它的时候,所有的文件都上传了,但是文件夹和文件只是在没有任何结构的情况下转储到服务器上,文件名看起来像这样c3nxv~9有没有办法上传文件和文件夹,同时保持结构和文件名完整,谢谢` private static void processDir(File dir) t

以下代码用于将文件和文件夹上载到服务器SFTP。我试图保持文件夹结构完整,即服务器上的C:\temp\test\file.txt变为/home/www/javauploads/temp/test/file.txt。但是当我运行它的时候,所有的文件都上传了,但是文件夹和文件只是在没有任何结构的情况下转储到服务器上,文件名看起来像这样c3nxv~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]));
        }
    }

}`

首先,与您的问题无关,您不应该为每个文件或目录启动新的会话和通道-打开会话和通道一次,并在所有文件上载时重复使用它。这将要快得多,因为每次会话打开都需要一些往返和一些复杂的密码计算。打开一个频道需要另一次往返

然后,看看它是如何工作的。它将远程文件名作为参数,并返回一个OutputStream,然后您可以将数据写入其中。您没有使用OutputStream,这意味着不会真正进行上传

我想您需要-这将采用本地和远程文件名,并上载本地文件的内容,创建远程文件或覆盖它(如果它已经存在)

此外,在Windows系统上,可能存在返回本地命名约定中的文件名(即以\分隔)的问题,而您需要以/分隔名称。我想你可以用一个简单的.替换'\\','/'


不过,这并不能真正解释您的观察结果——您使用的是哪个SSH服务器,在哪个系统上?

这个问题仍然存在吗?如果是这样,了解客户机和服务器系统以及SSH服务器可能会有所帮助。如果没有,请发布找到的解决方案。客户端是windows计算机,而服务器是bsd。谢谢