J'utilise jsch pour télécharger des fichiers du serveur, mon code ci-dessous.
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)
Le même code télécharge les types de fichier de document texte mais échoue pour le type de fichier 'Fichier'
Essayez d'utiliser des chemins au lieu de stream:
String destPath = "filename.txt";
if (!filesToDownload.isEmpty()) {
for (String fileDownloadName : filesToDownload) {
success = false;
sftpChannel.get(fileDownloadName , destPath);
EDIT si vous voulez utiliser FILE et les flux, vérifiez cet exemple:
http://kodehelp.com/Java-program-for-downloading-file-from-sftp-server/
Veuillez trouver dans l'exemple de code ci-dessous comprenant le fichier télécharger et télécharger fonctionnalités. Veuillez extraire les détails pertinents des fichiers de propriétés où une chaîne a été marquée lt;sftp.user.namegt;. Je supprime le fichier une fois le fichier téléchargé, vous pouvez l'avoir selon vos besoins.
Le un événement et lieu paramètres que j'ai ajoutés dans le cadre de la fonctionnalité de téléchargement consiste à filtrer le (s) fichier (s); vous pouvez transmettre les paramètres selon vos besoins.
Vous avez placé un chèque pour définir un proxy pouvant être utilisé en cas de besoin.
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();
}
}
}
}
J'ai fixé de cette façon:
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
}
Où remotePath est le nom du dossier SFTP distant.