繁体   English   中英

如何使用 Java SFTP 库 JSch 将文件从一个目录传输到另一个目录?

[英]How do I transfer a file from one directory to another using Java SFTP Library JSch?

我需要使用 JSch 库对文件传输进行编程。 我有一个包含两个文件夹的简单目录 -

在此处输入图片说明

SFTP_1文件夹中,我有一个位图图像。 SFTP_2文件夹只是一个空文件夹。 我的目标是使用 SFTP 将图像从 SFTP_1 传输到 SFTP_2 。

到目前为止,这是我的代码:

FileTransfer fileTransfer = new FileTransfer();              
      
JSch jsch = new JSch();

String host = "127.0.0.1";
int port = 22;

String user = "user";
Session session = jsch.getSession(user, host, port);      
session = jsch.getSession("username", "127.0.0.1", 22);
session.connect();

ChannelSftp sftp = null;
sftp = (ChannelSftp)session.openChannel("sftp") ; //channel;

sftp.rename(
    "C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_1\\house.bmp",
    "C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_2\\house.bmp");
session.disconnect();

我想要做的是简单地将文件从我机器中的一个目录传输到另一个目录。 任何提示表示赞赏,谢谢!

请注意,要在两个文件夹之间进行复制,不需要使用 SFTP。 可以从一个文件夹复制到另一个文件夹而不涉及 SFTP 协议,该协议主要用于远程复制文件,从本地机器到远程机器,或从远程机器到(相同或不同的)远程机器,或从远程机器到本地机器。

那是因为 FTP 是基于网络的协议。 因此,使用它(或其任何相关协议)将使用网络(或模拟网络)。

JSch 提供的安全性旨在防止网络上发生的某些类型的攻击。 它不会在机器内提供任何额外的安全性。

在单机上的文件夹之间复制文件,最简单的方法就是不要使用JSch,像这样

private static void copyFileUsingJava7Files(File source, File dest)
        throws IOException {
    Files.copy(source.toPath(), dest.toPath());
}

还有其他技术,如果你真的想使用 JSch,你需要意识到 JSch 必须提供很多“额外”的信息才能连接到你所在的机器,因为它会尝试连接到这台机器,好像它是通过网络连接的

Session sessionRead = jsch.getSession("username", "127.0.0.1", 22);
sessionRead.connect();

Session sessionWrite = jsch.getSession("username", "127.0.0.1", 22);
sessionWrite.connect();

ChannelSftp channelRead = (ChannelSftp)sessionRead.openChannel("sftp");
channelRead.connect();

ChannelSftp channelWrite = (ChannelSftp)sessionWrite.openChannel("sftp");
channelWrite.connect();

PipedInputStream pin = new PipedInputStream(2048);
PipedOutputStream pout = new PipedOutputStream(pin);

channelRead.get("/path/to/your/file/including/filename.txt", pout);
channelWrite.put(pin, "/path/to/your/file/destination/including/filename.txt");

channelRead.disconnect();
channelWrite.disconnect();

sessionRead.disconnect();
sessionWrite.disconnect();

上面的代码缺少错误检查、异常处理以及文件丢失、网络未启动等的回退例程。但您应该了解主要思想。

很明显,在不需要网络协议的情况下使用网络协议为更多故障场景打开了大门。 如果您的程序很快要复制不在您的机器上的文件,则仅使用 SFTP 方法。

实际上 JSch 是为远程工作而设计的,文件系统修改是此类工作的一种。 @Edwin Buck 回答使用网络在远程主机上的本地文件夹之间进行处理。 有更好的方法:

session.connect();
ChannelExec exec = (ChannelExec) session.openChannel("exec");
exec.setCommand("cp a.out b.out");
exec.connect();

我手头没有窗户,因此我的样本适用于 unix。 但想法很简单:在远程主机上执行复制命令。

如果原始发布者实际上是在寻找在两个不同 FTP 站点之间运行的 JSch 工作示例,请访问:

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
...
JSch jsch = new JSch();
JSch session = null;
try {
  session = jsch.getSession(userid, sourceservername, sourceserverport);
  session.setPassword(sourceserverpassword);
  Properties props = new Properties();
  props.put("StrictHostKeyChecking", "no");
  session.setConfig(props);
  session.connect();
  Channel channel = session.openChannel("sftp");
  channel.connect();
  ChanelSftp channelsftp = (ChannelSftp) channel;
  channelsftp.cd(sourcefilepath);
  channelsftp.lcd(localfilepath);
  FileOutputStream fos = new FileOutputStream(new File(localfilepath + "/" + localfilename));
  channelsftp.get(sourcefilename, fos);
  fos.flush();
  fos.close();
  channelsftp.disconnect()
  session.disconnect();
} catch (Exception e) {
  e.printStackTrace();
}

在实践中,您可以将这些操作分解为单独的 try{}catch(){} 阻塞语句,以便引入更精细的错误报告,以及添加任何信息输出行以通知用户状态等。但这会带你去。 诚然,虽然 JSch 示例比来自免费软件库的大多数此类示例更好,即使是像这样的好示例,但其中可能存在一些遗漏细节,这些细节可能会影响您使事情正常工作的尝试。 希望这有助于如果不是原始海报,那么其他人正在寻找一个有效的 JSch 示例。 一旦你让它工作起来,它就像一个魅力,所以值得麻烦。

核心 SFTP 协议不支持复制远程文件。

该协议有一份copy-file扩展草案,但只有少数 SFTP 服务器(例如ProFTPD/mod_sftp和 Bitvise SFTP 服务器)支持该草案。

最广泛使用的 OpenSSH SFTP 服务器绝对不支持它。

而且 JSch 库也不支持它。


另请参阅我对如何使用 SFTP 将文件复制/复制到另一个目录的回答


因此,不幸的是,实际上在“exec”通道( ChannelExec )上使用cp shell 命令是最好的可用方法(假设您连接到 *nix 服务器并且您具有 shell 访问权限)。


如果您没有 shell 访问权限,那么您唯一的选择确实是将文件下载到本地临时文件夹并将其上传回新位置(或使用流,以避免临时文件)。 这是@Edwin Buck 接受的答案所显示的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM