JSch поместил файл в подкаталог - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь поместить файл в каталог SFTP, используя JSch.

channelSftp.cd(destDir);
channelSftp.put(new FileInputStream(filePath), filePath.substring(filePath.lastIndexOf(File.separatorChar)));

Но приведенный выше код помещает файл всегда в домашний каталог пользователя SFTP, а не destDir. Например, если я создаю подкаталог test в домашнем каталоге пользователя и задаю destDir как channelSftp.getHome()+"test", файл все равно копируется только в домашний каталог пользователя, а не в тестовый подкаталог.

Я попытался перечислить файлы в destDir (подкаталог test), он показывает все файлы / каталоги в каталоге test.

Vector<com.jcraft.jsch.ChannelSftp.LsEntry> vv = channelSftp.ls(destDir);
if(vv != null) {
     for(int ii=0; ii<vv.size(); ii++){
         Object obj=vv.elementAt(ii);
         if(obj instanceof LsEntry){
             System.out.println(((LsEntry)obj).getLongname());
         }
     }
 }

Есть предложения? Я посмотрел на разрешения (подкаталог test имеет те же права, что и домашний каталог пользователя SFTP).

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Это работает очень хорошо !!

       channel.connect();

       try {
          channel.mkdir("subdir");
       } catch (Exception e) {
          // ... do something if subdir already exists
       }

       // Then the trick !
       channel.put(inputStream, "subdir" + "/" + "filename.ext");
0 голосов
/ 01 мая 2018

filePath.substring(filePath.lastIndexOf(File.separatorChar)) результат включает в себя даже последний разделитель.

Итак, если вы передадите /home/user/file.txt, вы получите /file.txt. Это абсолютный путь, поэтому любой рабочий каталог не учитывается, и вы фактически всегда пишете в корневую папку.

Вы хотите, чтобы filePath.substring(filePath.lastIndexOf(File.separatorChar) + 1) получил только file.txt.

См. Также Как получить имя файла из строки, содержащей абсолютный путь к файлу?

...