gpt4 book ai didi

java - 使用 Apache 从 FTP 下载中截断数据

转载 作者:行者123 更新时间:2023-12-01 17:51:43 25 4
gpt4 key购买 nike

使用 commons-net:commons-net:3.6 中的 Apache FTP 客户端,我正在从我们的 FTPS 服务器读取文件

FTPClient#retrieveFile("/OUT/somefile.xml", someBAOS)

通常情况下,一切正常,但有时文件会被截断。

这是一切正常时的协议(protocol):

< 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 生成的,我很确定更改后的大小不是来 self 的监听器。我猜想,该文本是由 FTP 服务器生成并按原样转储的。 有人可以确认文件大小确实来自服务器(而不是由 Apache 客户端添加)吗?

有趣的是,下载的截断文件有 2602133 字节(而且我相当确定,没有通过文本转换或类似方式添加 \r ;首先,我们进行转换;其次,区别是 31371 字节,有 56577 行)。

最可能的解释是有人同时更改了文件,但服务器日志清楚地表明当时没有其他人。

知道如何了解发生了什么吗?

结果

我还有一些日志清楚地显示在问题发生时大约有上传。与此同时,日志声称不存在时间重叠。无论如何,在确认 150 ... 行直接来自服务器后,毫无疑问并发访问是罪魁祸首。

最佳答案

消息内容

< 150 Opening BINARY mode data connection for /OUT/somefile.xml (2569402 bytes)

来自服务器,即提供文件的服务器只能看到长度为 2569402 字节的文件。最可能的原因(不知道此处涉及的实际系统)是您尝试下载的文件当前已创建。这就是为什么它会在几分钟后工作,因为文件创建此时已完成。

这是一个常见问题,有不同的解决方案:

  • 创建一个具有定义的前缀或后缀的同名锁定文件,您可以检查该文件是否存在,仅在不存在时才执行下载。
  • 检查大小一段时间,只有在大小一段时间内没有变化时才尝试下载。
  • 使用临时名称或其他目录创建文件,并将其重命名/移动到目标名称和目的地

正如我所说,我不认为这是您的客户端的问题,服务器清楚地报告了错误的长度,因此问题的原因一定存在。

关于java - 使用 Apache 从 FTP 下载中截断数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49415428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com