【发布时间】:2023-03-09 04:11:02
【问题描述】:
使用来自commons-net:commons-net:3.6 的 Apache FTP 客户端,我正在从我们的 FTPS 服务器读取文件
FTPClient#retrieveFile("/OUT/somefile.xml", someBAOS)
通常,一切正常,但有时文件会被截断。
这是一切正常时的协议:
< 220 ProFTPD 1.3.5a Server (someserver) [::ffff:...]
> AUTH TLS
< 234 AUTH TLS successful
> PBSZ 0
< 200 PBSZ 0 successful
> PROT P
< 200 Protection set to Private
> USER someuser
< 331 Password required for someuser
> PASS ***
< 230 User someuser logged in
> TYPE I
< 200 Type set to I
> PASV
< 227 Entering Passive Mode (...).
> RETR /OUT/somefile.xml
< 150 Opening BINARY mode data connection for /OUT/somefile.xml (4769503 bytes)
< 226 Transfer complete
当文件被截断时,记录较小的大小:
< 150 Opening BINARY mode data connection for /OUT/somefile.xml (2569402 bytes)
截断偶尔发生。在下一次下载时,一小时后,一切都恢复正常了。我们很确定该文件在此期间没有更改。
日志文件是使用SocketClient#addProtocolCommandListener 生成的,我很确定更改的大小不是来自我的听众。我猜,文本是由 FTP 服务器生成并按原样转储的。 有人可以确认文件大小确实来自服务器(而不是由 Apache 客户端添加)吗?
有趣的是,下载的截断文件有2602133字节(我很确定,没有通过文本转换等添加\rs;首先,我们进行转换;其次,差异是31371字节,有那里有 56577 行)。
最可能的解释是有人在此期间更改了文件,但服务器日志清楚地表明当时没有其他人。
知道如何找出发生了什么吗?
结果
我还有一些日志清楚地显示在问题发生时前后有上传。同时,日志声称没有时间重叠。无论如何,确认150 ... 行直接来自服务器,毫无疑问,并发访问是罪魁祸首。
【问题讨论】:
-
缺少字节或被截断?我假设被截断但值得确认。知道一些类似的错误,但认为 3.3 解决了大部分问题
-
您似乎有两个不同的问题。注意
<表示它是从服务器接收到的消息,所以服务器认为文件更小...至于服务器的大小想法和实际接收到的大小之间的差异,我们必须查看代码,看看someBAOS会发生什么。 -
编码?也许
ftpClient.setControlEncoding("UTF-8");(我知道它的二进制模式,应该没关系)。 -
@ficuscr 被截断,之前没有任何遗漏,只是检查了一下。关于编码:没有文件名包含任何特殊字符。没有文件可以混淆。但是,是的,我会
setControlEncoding。 -
@JimGarrison
<来自我,但是是的,它是从protocolReplyReceived调用的(我这边没有处理,除了过滤 PWD)。我可以想象 Apache 扩展消息(这该死的愚蠢,但愚蠢的事情总是发生)。关于代码,没有任何人可以在someBAOS.toByteArray()中搞砸并在下一行记录长度。无论如何,我已经检查了几十次......并且下载工作几乎总是有一些罕见的例外 - 恕我直言,这样的错误必须与网络相关。
标签: java apache file ftp ftp-client