我使用Jsch和Sftp协议在一个简单的Java应用程序中将文件从本地计算机上传到远程服务器。
我的代码没有错误或没有异常,它运行成功,但是当我查看远程位置时,文件上传为0kb,没有扩展名,并命名为“D”。
我尝试了很多方法,但我无法弄清楚错误。
这是我的代码..
String remoteDirectory = "D:\\Datastores\\RootStore\\Test\\";
String localDirectory = "C:\\pdffiles\\";
String fileToFTP = "demo.pdf";
String SFTPHOST = "hostIPaddress";
int SFTPPORT = 22;
String SFTPUSER = "username";
String SFTPPASS = "password";
String local_filename = fileToFTP;
String local_pathname = localDirectory;
String remote_filename = fileToFTP;
JSch jsch = null;
Session session = null;
ChannelSftp sftpChannel = null;
try
{
jsch = new JSch();
session = jsch.getSession(SFTPUSER, SFTPHOST);
session.setPassword(SFTPPASS);
session.setPort(SFTPPORT);
session.setConfig("StrictHostKeyChecking", "no");
session.setConfig("cipher.s2c", "aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,aes256-ctr");
session.setConfig("cipher.c2s", "aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,aes256-ctr");
session.connect();
sftpChannel = (ChannelSftp)session.openChannel("sftp");
sftpChannel.connect();
System.out.println(sftpChannel);
System.out.println(sftpChannel.getSession().isConnected());
FileInputStream fileBodyIns = new FileInputStream(local_pathname + local_filename);
System.out.println(local_pathname + local_filename);
System.out.println(remoteDirectory + remote_filename);
sftpChannel.put(fileBodyIns, remoteDirectory + remote_filename);
fileBodyIns.close();
sftpChannel.exit();
session.disconnect();
System.out.println("File uploaded successfully");
return "File uploaded successfully";
}
catch (Exception e)
{
e.printStackTrace();
return e.getMessage();
}
我的连接成功,行
System.out.println(sftpChannel.getSession().isConnected());
提供 true
并且以下行成功打印
System.out.println("File uploaded successfully");
答案 0 :(得分:0)
String remoteDirectory = "D:\\Datastores\\RootStore\\Test\\";
SFTP协议对远程服务器上的文件路径名使用类似unix的命名方案。文件分隔符是“/”,没有前导“/”的路径名被认为是相对于当前目录。冒号和反斜杠没有特殊含义。
根据这些规则,您要求远程服务器在主目录中创建一个名为“D:\ DataStores ...”的文件,其中包含文字冒号和反斜杠。如果您的远程服务器是Cygwin OpenSSH服务器或基于Unix的服务器的某个其他端口,则SFTP服务器解释文件名的方式与Windows操作系统解释文件名的方式可能不匹配。
您需要找出正确的语法,以通过此SFTP服务器引用D:驱动器上的路径。如果它是Cygwin SFTP服务器,我认为正确的语法是“/ cygdrive / d / Datastores / RootStore / Test / ...”。如果SFTP服务器是由其他供应商提供的,则可能需要查阅服务器文档。或者,您可以尝试以交互方式登录SFTP服务器,cd到“/”目录,然后从那里进行探索。如何引用D驱动器上的文件夹应该很明显。
答案 1 :(得分:0)
我同意肯斯特的回答。我在远程Windows机器上有类似的问题,linux风格的路径解决了我的问题。只想添加,ChannelSftp的根目录是远程Windows机器上的C:\ disk,我不确定是否有办法将文件放在D:\ disk上。