Java-апплет для загрузки файлов и папок при сохранении структуры каталога - PullRequest
1 голос
/ 23 июня 2011

следующий код предназначен для загрузки файлов и папок на сервер (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 голосов
/ 24 июня 2011

Во-первых (не имеет отношения к вашей проблеме), вы не должны начинать новый сеанс и канал для каждого файла или каталога - откройте сеанс и канал один раз и повторно используйте его для всех загрузок файлов. Это будет намного быстрее, так как каждое открытие сеанса занимает несколько циклов и некоторые сложные криптографические вычисления. Открытие канала занимает еще одну поездку.

Затем посмотрите, как работает ChannelSftp.put (String) . Он принимает имя удаленного файла в качестве аргумента и возвращает OutputStream, в который вы затем можете записать свои данные. Вы не используете OutputStream, что означает, что загрузка на самом деле не произойдет.

Полагаю, вы хотите ChannelSftp.put (String, String) - это будет принимать имя локального и удаленного файла и загружать содержимое локального файла, создавая удаленный файл (или перезаписывая его, если он уже существует).

Кроме того, может быть проблема в том, что dir.toString () возвращает имя файла в локальном соглашении об именах (т. Е. Разделяется \ в системах Windows), в то время как имена необходимо разделять /. Вы могли бы использовать простой .replace('\\', '/'), я думаю.

Это не совсем объясняет ваши наблюдения - какой SSH-сервер вы используете, в какой системе?

...