【问题标题】:downloading all files from sftp server in java从java中的sftp服务器下载所有文件
【发布时间】:2020-07-28 15:16:41
【问题描述】:

我正在尝试从 SFTP 服务器上的文件夹中下载所有文件,以下是我的代码请提出更改建议,以便我可以从远程目录下载所有可用文件并保存到本地目录

package svb.ftp.bs.load;

import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException;

import java.io.FileNotFoundException;
import java.io.File;
import java.io.FileInputStream;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;

import java.io.InputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;

import java.util.List;

import org.apache.commons.net.ftp.FTP;

import org.apache.commons.io.IOUtils;

import org.junit.Test;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

import java.io.IOException;
import java.io.InputStream;

import java.util.Vector;

public class downloadFtp {

    public static void main(String[] args) {

        String SFTPHOST = "host";
        int SFTPPORT = 22;
        String SFTPUSER = "user";
        String SFTPPASS = "Pass";
        String privateKey = "E:\\Oracle\\mywork\\DownloadFTP\\ppk.ppk";
        String SFTPWORKINGDIR = "Inbox/ARR_SI_MedicalTranscriptionBillCorp_PD_20200724_32137.TXT";

        com.jcraft.jsch.Session session = null;
        Channel channel = null;
        ChannelSftp channelSftp = null;
        JSch jsch = new JSch();
        try {
            jsch.addIdentity(privateKey);
            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();
            System.out.println("Connected");
            channelSftp = (ChannelSftp) channel;
            channelSftp.cd(SFTPWORKINGDIR);

            
            InputStream is = channelSftp.get(SFTPWORKINGDIR);
            IOUtils.copy(is, System.out);
            is.close();


            System.out.println("File Uploaded to FTP Server Sucessfully.");
        } catch (JSchException jse) {
            // TODO: Add catch code
            jse.printStackTrace();
        } catch (SftpException se) {
            // TODO: Add catch code
            se.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
       

    }
}

目前,当我运行代码时,它显示在错误下方

4: Can't change directory: /Inbox/ARR_SI_MedicalTranscriptionBillCorp_PD_20200724_32137.TXT
    at com.jcraft.jsch.ChannelSftp.cd(ChannelSftp.java:350)
    at svb.ftp.bs.load.downloadFtp.main(downloadFtp.java:67)
Process exited with exit code 0.

【问题讨论】:

    标签: java sftp jsch private-key


    【解决方案1】:

    stacktrace 告诉你出了什么问题。

    无法更改目录:/Inbox/ARR_SI_MedicalTranscriptionBillCorp_PD_20200724_32137.TXT

    问题在于:

    channelSftp.cd(SFTPWORKINGDIR);
    

    这里您传递的是文件名,但它需要一个目录(cd 代表更改目录)。您不能对文件进行 CD。

    如果您传递文件夹/路径,它将起作用。尝试以下方法:

    channelSftp.cd("/Inbox/a_folder/");
    

    如何全部下载: 参考:https://ganeshtiwaridotcomdotnp.blogspot.com/2020/07/download-files-from-ftp-using-jsch-java.html

    为了下载所有文件,首先列出根文件夹中的所有文件,对其进行迭代。如果是文件下载,如果是文件夹,则列出内容并继续递归处理子文件夹。

    以下是如何从定义的文件夹下载文件的示例:

    import com.jcraft.jsch.*;
    
    import java.util.Properties;
    import java.util.Vector;
    
    public class JschDownload {
    
        public static void main(String[] args) {
    
            Session session = null;
            Channel channel = null;
            JSch jsch = new JSch();
            try {
                session = jsch.getSession("demo", "test.rebex.net", 22);
                session.setPassword("password");
                Properties config = new Properties();
                config.put("StrictHostKeyChecking", "no");
                session.setConfig(config);
                session.connect();
                System.out.println("session connect");
    
    
                channel = session.openChannel("sftp");
                channel.connect();
                System.out.println("Connected");
    
                ChannelSftp channelSftp = (ChannelSftp) channel;
                downloadFromFolder(channelSftp, "/");
                downloadFromFolder(channelSftp, "/pub/example/");
    
                System.out.println("File Uploaded to FTP Server Sucessfully.");
            } catch (Exception e) {
                e.printStackTrace();
    
            } finally {
                if (channel != null) {
                    channel.disconnect();
                }
                session.disconnect();
            }
    
        }
    
        static void downloadFromFolder(ChannelSftp channelSftp, String folder) throws SftpException {
            Vector<ChannelSftp.LsEntry> entries = channelSftp.ls(folder);
            System.out.println(entries);
    
            //download all from root folder
            for (ChannelSftp.LsEntry en : entries) {
                if (en.getFilename().equals(".") || en.getFilename().equals("..") || en.getAttrs().isDir()) {
                    continue;
                }
    
                System.out.println(en.getFilename());
                channelSftp.get(folder + en.getFilename(), en.getFilename());
            }
        }
    
    }
    

    有关 jsch 库的示例和文档,请参阅 http://www.jcraft.com/jsch/examples/

    【讨论】:

    • 好的,我如何下载所有存在Inbox文件夹的文件
    • LsEntry 未找到
    • 下载文件的目标文件夹路径在哪里设置
    • LsEntry 在 'com.jcraft.jsch.ChannelSftp' 包中定义。添加以下导入语句import com.jcraft.jsch.ChannelSftp.*;
    • 它工作正常!但是不知道如何下载所有这些文件并放在本地文件夹中,因为它只列出文件
    最近更新 更多