2017-07-10 19 views
0

ローカルマシンからリモートサーバにファイルを移動しようとしています。しかし、私はJSchのAPIでそれを行うことができません。Jschを使用してディレクトリをSFTPサーバに転送

for (File f : fileList) { 
    channelSftp.put(new FileInputStream(f), "/ROOT/File/"+f.getName()); 
} 

私は私のローカルマシンのディレクトリ/Home/File/file1.txt、FILE2、TXTのfile3.txtをループなどとのfileListに保存しています。

これらのファイルをSFTPサーバーの別のディレクトリに転送する必要があります。 /ROOT/File/file1.txt、file2、txt file3.txtと言ってください。

/ROOTファイルのパス名を/ Homeに変更する方法がわかりません。私もsftpChannel.mkdir(フォルダ)を使わずにすべてのファイルをコピーする必要があります。 JSchの[フォルダを1つずつ作成する]

+0

zipファイルを削除して問題がありますか?あなたのコードに何が問題なのですか? –

答えて

2

"/ home/ROOTファイルのパス名を変更する方法がわかりません。また、sftpChannel.mkdir(フォルダ)を使わずにすべてのファイルをコピーする必要があります; JSchで[フォルダを1つずつ作成] - 私はこれをはっきりと理解していません。コード内でmkdirを使い、すでに存在するディレクトリを持っていないのですか? PFBサンプルコード。コードを実行する前にサーバーにROOTディレクトリを作成することができます。これがループローカルディレクトリ内のファイルおよびSFTPサーバーに転送する。..

public static void main (String args[]) throws FileNotFoundException, IOException 
{ 
    try { 
     JSch jsch = new JSch(); 
     Session session = jsch.getSession("sftpuser", "sftphost"); 
     session.setPassword("sftppassword"); 
     java.util.Properties config = new java.util.Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     config.put("PreferredAuthentications", 
       "publickey,keyboard-interactive,password"); 

     session.setConfig(config); 
     session.connect(); 
     Channel channel = session.openChannel("sftp"); 
     channel.connect(); 
     System.out.println("sftp channel opened and connected."); 
     ChannelSftp channelSftp = (ChannelSftp) channel; 

     String sftpDirectory = "/target/Rootlocation"; 

     File directory = new File("C:\\Windows\\HomeLocation"); 
     File[] fList = directory.listFiles(); 

     for (File file : fList){   
      if (file.isFile()){ 
       String filename=file.getAbsolutePath(); 
       channelSftp.put(filename, sftpDirectory, ChannelSftp.OVERWRITE); 
       System.out.println(filename + " transferred to " + sftpDirectory); 
      } 
     } 
    } 
    catch (JSchException e) { 
     e.printStackTrace(); 
    }catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     System.out.println("Transfer Process Completed..."); 
    } 
} 
+0

@ Siva ..もし私が完全なディレクトリファイルパスを与えたら、それは自動的にディレクトリを作成してファイルを挿入します。ファイルがすでに存在する場合は更新します。 – Easy2DownVoteHard2Ans

+0

簡単に言えば、C:/ user // Homeはローカルマシンのルートディレクトリです。/ROOTはsftpマシンのルートディレクトリです。例えば。 WindowsからLinuxにファイルをコピーする。 – Easy2DownVoteHard2Ans

1

PFBのサンプルコードは、ローカルマシンのディレクトリ名に基づいて、リモート・サーバに自動的にディレクトリを作成したい場合。これはローカルディレクトリC:\ user \ Homeのすべてのファイルを再帰的にチェックし、linux serverの/ ROOT /ディレクトリに同じフォルダ構造で移動します(例:folder1、folder2がC: \ user \ Homeでは、同じフォルダ名がsftp serverの/ Root /ディレクトリに作成されます)。ファイルがsftp serverにすでに存在する場合、これもファイルを上書きします。

public static void main (String args[]) throws FileNotFoundException, IOException, ParseException 
{ 
    try { 
     JSch jsch = new JSch(); 
     Session session = jsch.getSession("sftpuser", "sftphost"); 
     session.setPassword("sftppassword"); 
     java.util.Properties config = new java.util.Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     config.put("PreferredAuthentications", 
       "publickey,keyboard-interactive,password"); 
     session.setConfig(config); 
     session.connect(); 
     Channel channel = session.openChannel("sftp"); 
     channel.connect(); 
     channelSftp = (ChannelSftp) channel; 
     System.out.println("sftp channel opened and connected."); 
     sftpDirectory = "/ROOT/"; 
     NewDir=sftpDirectory; 
     listf("C:\\user\\Home"); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     System.out.println("Transfer Process Completed..."); 
    } 
public static List<File> listf(String directoryName) throws JSchException, SftpException { 
    File directory = new File(directoryName); 
    List<File> resultList = new ArrayList<File>(); 
    File[] fList = directory.listFiles(); 
    resultList.addAll(Arrays.asList(fList)); 
    for (File file : fList) { 
     if (file.isFile()) { 
      String filename=file.getAbsolutePath(); 
      channelSftp.put(filename, NewDir, ChannelSftp.OVERWRITE); 
      System.out.println(filename + " transferred to " + sftpDirectory); 
     } else if (file.isDirectory()) { 
      System.out.println(file.getAbsolutePath()); 
      NewDir = sftpDirectory+file.getName(); 
      channelSftp.mkdir(NewDir); 
      System.out.println(NewDir + " Folder created "); 
      resultList.addAll(listf(file.getAbsolutePath())); 
     } 
    } 
    System.out.println(fList); 
    return resultList; 
} 
0

「ファイル」ディレクトリをzipファイルに変換してから、sftpを使用してリモートサーバに転送し、zipファイルを解凍します。

ZipFile zipFile = new ZipFile("C:/temp/File.zip"); 
      ArrayList<File> filesToAdd = new ArrayList<File>(); 
      File folder = new File("C:/temp/File"); 
      File[] listOfFiles = folder.listFiles(); 
      // Add files to be archived into zip file 
      for (File file : listOfFiles) { 
       filesToAdd.add(file); 
      } 

は、その後、あなたは一度ChannelExecを使用して、それを解凍移したzipファイルを

channelSftp.put(new FileInputStream("C:/temp/File.zip"), "/ROOT/"); 

SFTP

を使用してジップタイプの転送ファイルに変換フォルダにする必要があります。

ChannelExec channelExec = (ChannelExec) session.openChannel("exec"); 
channelExec.setCommand("unzip /ROOT/File.zip"); 

その後

channelExec.setCommand("rm /ROOT/File.zip"); 
関連する問題