我使用了 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中,没有传输模式。或者换句话说,只有binary传输模式。
即使 JSch 使用支持 ascii 模式的较新版本的 SFTP 协议,binary 模式仍然是 SFTP 中的默认模式。
所以你不需要做任何事情。
这与 FTP 协议形成对比,FTP 协议默认为 ascii 模式。因此,您已使用 FTP 明确切换到 binary 模式(在 Apache Commons Net 的情况下使用
FTPClient.setFileType
)。
FTPClient.setFileTransferMode
– 你的FTP代码是错误的。该方法接受 *_TRANSFER_MODE
常量之一。从来没有*_FILE_TYPE
。如果您使用 BINARY_FILE_TYPE
,则会导致向服务器发送无效的 MODE I
命令。这肯定会失败,因此根本没有任何效果。检查方法结果代码,肯定返回false
。
从您的 FTP 代码中删除呼叫。无需致电
FTPClient.setFileTransferMode
。无论如何,Apache Commons Net 仅支持默认的“流”模式(大多数 FTP 服务器也不支持任何其他模式)。
注意名称中的混淆。 Ascii/二进制实际上通常被称为“传输模式”。但在 FTP 协议规范(RFC 959 的第 3.1.1 节)中,它们实际上称为“数据类型”,并使用
TYPE
命令进行管理。
虽然 FTP 规范所称的“传输模式”由
MODE
命令(第 3.4 节)控制,但它们是完全不同的模式:流/块/压缩。它们几乎从未被设定或什至被提及。
由于 Apache Commons Net
FtpClient
混淆了设置“传输模式”的方法 .setFileTransferMode
,它经常导致像你一样的错误 – 人们错误地尝试使用 FTPClient.setFileTransferMode
在二进制/ascii “数据之间切换类型”.