Downloading files from an SFTP server using JSch

前端 未结 3 444
北恋
北恋 2020-12-15 22:17

I am using jsch to download files from server, my code below.

public static void downloadFile(TpcCredentialsDTO dto) {
        logger.trace(\"Entering downlo         


        
相关标签:
3条回答
  • 2020-12-15 22:53

    Please find in the below code sample comprising the file upload and download functionalities. Please pull the relevant details from properties files where ever string marked in lt;sftp.user.namegt;. I am deleting the file once the file is downloaded you can have it as per your requirement.

    The event and locale parameters what I have added as part of download functionality is to filter the file(s); you can pass parameters as par you need.

    Have placed a check to set proxy which can be used on need basis.

    package com.util;
    
    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelSftp;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.ProxyHTTP;
    import com.jcraft.jsch.Session;
    import com.jcraft.jsch.SftpException;
    import java.io.File;
    import java.io.FileInputStream;
    import java.util.Date;
    import java.util.Properties;
    import java.util.Vector;
    
    /**
     *
     * @author Dinesh.Lomte
     */
    public class SftpUtil {
    
        /**
         * 
         * @param fileName
         * @throws Exception 
         */
        public static void upload(String fileName)
        throws Exception {
    
            String method = "upload(String fileName)";
            Session session = null;
            Channel channel = null;
            ChannelSftp channelSftp = null;
            try {
                // Creating and instantiating the jsch specific instance
                JSch jsch = new JSch();
                // Fetching and setting the parameters like: user name, host and port 
                // from the properties file
                session = jsch.getSession("<sftp.user.name>",
                        "<sftp.host>",
                        Integer.valueOf("<sftp.port>"));
                // Fetching and setting the password as configured in properties files
                session.setPassword("<sftp.user.password>");
                // Setting the configuration specific properties
                Properties config = new Properties();
                config.put("StrictHostKeyChecking", "no");
                session.setConfig(config);            
                // Validating if proxy is enabled to access the sftp
                isSftpProxyEnabled(session);
                // Execution start time
                long lStartTime = new Date().getTime();
                System.out.println("Connecting to the sftp...");
                // Connecting to the sftp 
                session.connect();
                System.out.println("Connected to the sftp.");            
                // Execution end time
                long lEndTime = new Date().getTime();
                System.out.println("---------------------------------------------");
                System.out.println("Connected to SFTP in : " + (lEndTime - lStartTime));
                // Setting the channel type as sftp
                channel = session.openChannel("sftp");
                // Establishing the connection
                channel.connect();
                channelSftp = (ChannelSftp) channel;
                // Setting the folder location of the external system as configured
                channelSftp.cd("<sftp.output.folder.url>");
                // Creating the file instance
                File file = new File(fileName);
                // Creating an fileInputStream instance
                FileInputStream fileInputStream = new FileInputStream(file);
                // Transfering the file from it source to destination location via sftp
                channelSftp.put(fileInputStream, file.getName());
                // Closing the fileInputStream instance
                fileInputStream.close();
                // De-allocating the fileInputStream instance memory by assigning null
                fileInputStream = null;
            } catch (Exception exception) {
                throw exception;
            } finally {
                // Validating if channel sftp is not null to exit
                if (channelSftp != null) {
                    channelSftp.exit();
                }
                // Validating if channel is not null to disconnect
                if (channel != null) {
                    channel.disconnect();
                }
                // Validating if session instance is not null to disconnect
                if (session != null) {
                    session.disconnect();
                }
            }
        }
    
        /**
         * 
         * @param session 
         */
        private static void isSftpProxyEnabled(Session session) {
            // Fetching the sftp proxy flag set as part of the properties file
            boolean isSftpProxyEnabled = Boolean.valueOf("<sftp.proxy.enable>");
            // Validating if proxy is enabled to access the sftp
            if (isSftpProxyEnabled) {
                // Setting host and port of the proxy to access the SFTP
                session.setProxy(new ProxyHTTP("<sftp.proxy.host>", 
                        Integer.valueOf("<sftp.proxy.port>");
            }
            System.out.println("Proxy status: " + isSftpProxyEnabled);
        }
    
        /**
         * 
         * @param folder
         * @param event
         * @param locale
         */
        public static void download(String folder, String event, String locale) {
    
            String method = "download(String folder, String event, String locale)";
            Session session = null;
            Channel channel = null;
            ChannelSftp channelSftp = null;
            try {
                // Creating and instantiating the jsch specific instance
                JSch jsch = new JSch();
                // Fetching and setting the parameters like: user name, host and port 
                // from the properties file
                session = jsch.getSession("<sftp.user.name>",
                        "<sftp.host>",
                        Integer.valueOf("<sftp.port>"));
                // Fetching and setting the password as configured in properties files
                session.setPassword("<sftp.user.password>");
                // Setting the configuration specific properties
                Properties config = new Properties();
                config.put("StrictHostKeyChecking", "no");
                session.setConfig(config);            
                // Validating if proxy is enabled to access the sftp
                isSftpProxyEnabled(session);
                // Execution start time
                long lStartTime = new Date().getTime();
                System.out.println("Connecting to the sftp...");
                // Connecting to the sftp 
                session.connect();
                System.out.println("Connected to the sftp.");            
                // Execution end time
                long lEndTime = new Date().getTime();
                System.out.println("---------------------------------------------");
                System.out.println("Connected to SFTP in : " + (lEndTime - lStartTime));
                // Setting the channel type as sftp
                channel = session.openChannel(SFTP);
                // Establishing the connection
                channel.connect();
                channelSftp = (ChannelSftp) channel;
                try {
                    // Setting the folder location of the external system as configured 
                    // to download the file from
                    channelSftp.cd("<sftp.input.folder.url>");
                } catch (SftpException sftpException) {
                    System.out.println("Failed to change the directory in sftp.");                
                }
                // Listing all the .csv file(s) specific to the source system, event type (download) and locale code
                Vector<ChannelSftp.LsEntry> lsEntries = channelSftp.ls(
                        new StringBuilder("*").append("<sys.code>").append("*").append(event)
                        .append("*").append(locale).append("*").append(".csv").toString());
                // Validating if files exist to process the request further
                if (lsEntries.isEmpty()) {
                    System.out.println("No file exist in the specified sftp folder location.");
                }
                // Iterating the list of entries to download the file(s) from the sftp 
                for (ChannelSftp.LsEntry entry : lsEntries) {
                    try {
                        // Downloading the specified file from the sftp to the specified folder path
                        channelSftp.get(entry.getFilename(), new StringBuilder(folder)
                                .append(File.separator).append(entry.getFilename()).toString());
                    } catch (SftpException sftpException) {
                        System.out.println("Failed to download the file the sftp folder location.");                    
                    }                
                }
                // Iterating the list of entries to delete the file(s) from the sftp 
                for (ChannelSftp.LsEntry entry : lsEntries) {
                    try {
                        // Deleting the specified file from the sftp
                        channelSftp.rm(entry.getFilename());
                    } catch (SftpException sftpException) {
                        System.out.println("Failed to delete the file from the sftp folder location.");                    
                    }                
                }
            } catch (Exception exception) {
                System.out.println("Failed to download the file(s) from SFTP.");            
            } finally {
                // Validating if channel sftp is not null to exit
                if (channelSftp != null) {
                    channelSftp.exit();
                }
                // Validating if channel is not null to disconnect
                if (channel != null) {
                    channel.disconnect();
                }
                // Validating if session instance is not null to disconnect
                if (session != null) {
                    session.disconnect();
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-15 23:02

    Try using paths instead of stream:

    String destPath = "filename.txt";        
    
    if (!filesToDownload.isEmpty()) {
        for (String fileDownloadName : filesToDownload) {
            success = false;
            sftpChannel.get(fileDownloadName , destPath);  
    

    If you wanna use file and streams check this example:
    http://kodehelp.com/java-program-for-downloading-file-from-sftp-server/

    0 讨论(0)
  • 2020-12-15 23:06

    I fixed in this way:

    Vector<ChannelSftp.LsEntry> files = sftp.ls(remotePath);
    String remotePath = properties.getFtpPath();
    Vector<ChannelSftp.LsEntry> files = sftp.ls(remotePath);
    
    for (ChannelSftp.LsEntry entry : files) {
    
        InputStream stream = sftp.get(remotePath + "/" + entry.getFilename());
        // Your business code here
    
    }
    

    Where remotePath is the remote SFTP folder name.

    0 讨论(0)
提交回复
热议问题