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

Iva*_*tki 3 java ftp sftp jsch apache-commons-net

我使用 Apache Common NetFTPClient并在上传文件之前使用如下所示的方法进行设置ftpClient

ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ryl 7

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

\n
\n

JSch 使用 SFTP 协议版本 3。

\n

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

\n

即使 JSch 使用支持ascii模式的较新版本的 SFTP 协议,二进制模式仍然是 SFTP 中的默认模式。

\n

所以你不需要做任何事情。

\n

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

\n
\n

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

\n

从 FTP 代码中删除该调用。没有必要打电话FTPClient.setFileTransferMode。无论如何,Apache Commons Net 仅支持默认的“流”模式(并且大多数 FTP 服务器也不支持任何其他模式)。

\n
\n

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

\n

虽然 FTP 规范所称的“传输模式”由MODE命令(第 3.4 节)控制,但它们是完全不同类型的模式:流/块/压缩。它们几乎从未被设定或什至被提及。

\n

由于 Apache Commons NetFtpClient混淆了设置“传输模式”的方法的名称.setFileTransferMode,因此经常会导致像您那样的错误 \xe2\x80\x93 人们错误地尝试使用FTPClient.setFileTransferMode在二进制/ascii “数据类型”之间切换之间切换。

\n