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

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

}`

最佳答案

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

然后,看看如何 ChannelSftp.put(String)作品。它将远程文件名作为参数,并返回一个 OutputStream,然后您可以将数据写入其中。您没有使用 OutputStream,这意味着实际上不会发生上传。

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

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

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

关于Java 小程序上传文件和文件夹,同时保持目录结构完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6458961/

相关文章:

java - ProcessBuilder 不会触发

java - 如何找到字符串中最长的单词?

java - 在 java arraylist 中查找重复对象

c# - 如何访问在ashx中修改的aspx中的 session ?

entity-framework - 如何使用 Azure 存储和 Entity Framework 上传文件

java - jdk 9 中弃用的 jnlp 和 java web 启动技术 - 替代方案?

java - 文件导出到 jar 后给出空指针

node.js - 如何用强大的js限制文件类型

java - 为什么 Appletviewer 抛出 AccessControlException : access denied

java - 为什么 java applets/javafx 没有被广泛使用? (为什么我不应该将它们用于 RIA)