首先,从你的问题中并不清楚你是否知道JSch和Apache Commons NetFtpClient
每个都使用完全不同且不相关的协议。 JSch 是一个 SSH/SFTP 客户端,而FtpClient
是一个FTP客户端。
JSch 使用 SFTP 协议版本 3。
在SFTP协议版本3中,没有传输模式。或者换句话说,只有binary传输模式。
即使 JSch 使用较新版本的 SFTP 协议,该协议也支持ascii模式,即binary无论如何,模式是 SFTP 中的默认值。
所以你不需要做任何事情。
这与 FTP 协议形成对比,FTP 协议默认为ascii模式。所以你已经明确切换到binaryFTP 模式(使用FTPClient.setFileType https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#setFileType(int)对于 Apache Commons Net)。
至于FTPClient.setFileTransferMode https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#setFileTransferMode(int)– 您的 FTP 代码错误。该方法接受其中之一*_TRANSFER_MODE
常数。从来没有*_FILE_TYPE
。如果你使用BINARY_FILE_TYPE
,这会导致发送无效的MODE I
命令到服务器。这肯定会失败,因此根本没有任何效果。检查方法结果码,肯定有返回false
.
从 FTP 代码中删除该调用。无需致电FTPClient.setFileTransferMode
。无论如何,Apache Commons Net 仅支持默认的“流”模式(并且大多数 FTP 服务器也不支持任何其他模式)。
请注意名称中的混乱。 Ascii/二进制实际上通常被称为“传输模式”。但在 FTP 协议规范中(第 3.1.1 节)RFC 959 https://datatracker.ietf.org/doc/html/rfc959),它们实际上被称为“数据类型”并使用TYPE
命令。
虽然 FTP 规范称之为“传输模式”,但受MODE
命令(第 3.4 节)是完全不同的模式:流/块/压缩。它们几乎从未被设定或什至被提及。
作为 Apache Commons NetFtpClient
设置“传输模式”的方法名称容易混淆.setFileTransferMode
,它经常会导致像你一样的错误 – 人们错误地尝试使用FTPClient.setFileTransferMode
在二进制/ascii 之间切换“数据类型”.