Java-апплет для загрузки файлов и папок с сохранением структуры каталогов

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

}`

person Arphadax    schedule 23.06.2011    source источник
comment
Эта проблема все еще открыта? Если это так, может помочь узнать клиентскую и серверную системы, а также SSH-сервер. Если нет, опубликуйте найденное решение.   -  person Paŭlo Ebermann    schedule 27.06.2011


Ответы (1)


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

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

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

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

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

person Paŭlo Ebermann    schedule 24.06.2011
comment
клиент - это машина с Windows, а сервер - bsd. Спасибо - person Arphadax; 30.06.2011