JSch中如何设置文件类型和文件传输模式?

How to set file type and file transfer mode in JSch?

我使用 Apache Common Net FTPClient 并在上传文件之前使用下面显示的方法设置了我的 ftpClient

ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);

现在我尝试使用JSch。文件上传之前是否需要相同的设置以及它们的外观?谢谢

首先,从您的问题中不清楚您是否知道 JSch 和 Apache Commons Net FtpClient 各自使用完全不同且不相关的协议。 JSch 是 SSH/SFTP 客户端,而 FtpClient 是 FTP 客户端。


JSch 使用 SFTP 协议版本 3。

在SFTP协议版本3中,没有传输模式。或者换句话说,只有二进制传输模式。

即使 JSch 使用支持 ascii 模式的较新版本的 SFTP 协议,binary mode 在 SFTP.

中是默认的

所以你什么都不用做。

这与FTP协议形成对比,后者默认为ascii模式。因此,您已使用 FTP 显式切换到 binary 模式(在 Apache Commons Net 的情况下使用 FTPClient.setFileType)。


至于 FTPClient.setFileTransferMode – 您的 FTP 代码是错误的。该方法接受 *_TRANSFER_MODE 常量之一。从来没有 *_FILE_TYPE。如果您使用 BINARY_FILE_TYPE,它会导致向服务器发送无效的 MODE I 命令。这肯定会失败,因此根本没有效果。检查方法结果代码,肯定是 returns false.

从您的 FTP 代码中删除调用。无需调用FTPClient.setFileTransferMode。 Apache Commons Net 无论如何只支持默认的“流”模式(大多数 FTP 服务器也不支持任何其他模式)。


注意名称中的混淆。 ascii/binary 通常确实被称为“传输模式”。但在 FTP 协议规范中(RFC 959 的 3.1.1 节),它们实际上被称为“数据类型”,并使用 TYPE 命令进行管理。

虽然 FTP 规范称为“传输模式”,由 MODE 命令(第 3.4 节)管理,是完全不同类型的模式:stream/block/compressed。它们几乎从未被设定甚至被提及。

由于 Apache Commons Net FtpClient 混淆了设置“传输模式”的方法 .setFileTransferMode,它经常导致像你一样的错误 – 人们错误地尝试使用 FTPClient.setFileTransferMode在 binary/ascii "数据类型".

之间切换