2012-12-03 18 views
7

Tôi đang sử dụng jsch để tải xuống tệp từ máy chủ, mã của tôi bên dưới.Tải xuống tệp từ máy chủ SFTP bằng cách sử dụng JSch

public static void downloadFile(TpcCredentialsDTO dto) { 
     logger.trace("Entering downloadFile() method"); 

    Session session = null; 
    Channel channel = null; 
    ChannelSftp channelSftp = null; 
    boolean success = false; 

    try { 
     JSch jsch = new JSch(); 
     session = jsch.getSession(dto.getUsername(), dto.getHost(), 
       dto.getPort()); 
     session.setPassword(dto.getPassword()); 

     session.setConfig("StrictHostKeyChecking", "no"); 
     session.connect(); 
     logger.info("Connected to " + dto.getHost() + "."); 

     channel = session.openChannel("sftp"); 
     channel.connect(); 
     channelSftp = (ChannelSftp) channel; 

     List<String> filesToDownload = getFilesToDownload(dto,channelSftp); 

     if (!filesToDownload.isEmpty()) { 
      for (String fileDownloadName : filesToDownload) { 
       success = false; 
       OutputStream output = new FileOutputStream(
        "C:\Download\BLT_03112012"); 

       channelSftp.get("BLT_03112012",output); 
       success = true; 
       if (success) 
        logger.info(ServerConstants.DOWNLOAD_SUCCESS_MSG 
            + fileDownloadName); 
       output.close(); 
      } 

     }else { 
      logger.info(ServerConstants.NO_FILES_TO_DOWNLOAD 
        + ServerUtils.getDateTime()); 
      success = true; 
     } 

    } catch (JSchException ex) { 
     logger.error(ServerConstants.SFTP_REFUSED_CONNECTION, ex); 
    } catch (SftpException ex) { 
     logger.error(ServerConstants.FILE_DOWNLOAD_FAILED, ex); 
    } catch (IOException ex) { 
     logger.error(ServerConstants.FILE_NOT_FOUND, ex); 
    }catch (Exception ex) { 
     logger.error(ServerConstants.ERROR, ex); 
    }finally { 
     if (channelSftp.isConnected()) { 
      try { 
       session.disconnect(); 
       channel.disconnect(); 
       channelSftp.quit(); 
       logger.info(ServerConstants.FTP_DISCONNECT); 
      } catch (Exception ioe) { 
       logger.error(ServerConstants.FTP_NOT_DISCONNECT, ioe); 
      } 
     } 
    } 
    logger.trace("Exiting downloadFile() method"); 
} 


sftpChannel.get(filename, outputstream) is throwing an error. 
2: File not found 
     at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2629) 
     at com.jcraft.jsch.ChannelSftp._get(ChannelSftp.java:977) 
     at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:946) 
     at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:924) 
     at za.co.tpc.sftpserver.SftpConnection.downloadFile(SftpConnection.java:72) 
     at za.co.tpc.server.execute.FtpMtn.main(FtpMtn.java:44) 

Cùng mã không tải về các loại tập tin Text Document nhưng không cho 'File' filetype

Trả lời

8

Hãy thử sử dụng đường dẫn thay vì dòng:

String destPath = "filename.txt";   

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

EDIT nếu bạn muốn sử dụng FILE và luồng, hãy kiểm tra ví dụ này:

http://kodehelp.com/java-program-for-downloading-file-from-sftp-server/

+0

Hi Carlos cảm ơn câu trả lời. Khi destPath là một tệp txt nó hoạt động tốt nhưng nó không thành công khi loại tệp là một TẬPTIN. – FaithN

+0

câu trả lời được cập nhật. –

+0

Cảm ơn giải pháp của bạn Carlos, tôi đã được sắp xếp ngay bây giờ :-). – FaithN

2

hãy tìm trong mẫu mã bên dưới bao gồm các tập tin tải lên tải chức năng. Vui lòng lấy các chi tiết có liên quan từ các tệp thuộc tính trong đó có chuỗi được đánh dấu ở lt; sftp.user.name gt;. Tôi đang xóa tệp khi tệp được tải xuống, bạn có thể tải tệp đó theo yêu cầu của mình.

Các sự kiện sự kiệnlocale những gì tôi đã thêm làm chức năng tải xuống là lọc (các) tệp; bạn có thể chuyển các tham số như mệnh lệnh bạn cần.

Đã đặt séc để đặt proxy có thể được sử dụng khi cần.

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

Tôi cố định theo cách này:

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 

} 

đâu remotePath là điều khiển từ xa SFTP tên thư mục.