我目前在从 FTP 服务器下载一些文件时遇到问题:它们损坏了。有关该问题的介绍请参见这个问题(当时我认为问题出在我的基于 Qt 的软件上,但现在我确信问题出在服务器上)。
情况是这样的:我想将 8 个文件复制到 FTP 服务器,然后使用基于 Qt 的软件和 QNetworkAccessManager 下载它们。在尝试这样做的过程中,我发现永远8 个文件中有 3 个损坏(使用哈希验证和文件大小)的方式相同(文件大小错误)。问题不在我的软件上:使用 Mozilla 和 Chrome 下载文件会导致精确的同样的错误。整个过程如下:
- Linux Ubuntu 文件夹中有 8 个文件。文件大小正常。
- 这 8 个文件被传输到 Windows 7 文件夹。
- 使用 FileZilla 将文件发送到 FTP 服务器。完成后,FileZilla 会通知正确的8 个文件各自的大小。
- 在 Linux Ubuntu awa 和 Windows 中,文件均使用浏览器和基于 Qt 的应用程序(带有 QNetworkAccessManager)下载。在 Windows 中,文件也使用 FileZilla 下载。
- 相同的 3 个文件已损坏——通过不同的大小得到验证。
在讨论该 SO 问题中的问题后,有人提出该问题可能出在服务器端。我在网上做了一些研究,发现这,这和这。建议使用 FileZilla 进行不同的大小计算(这很难,因为我大部分时间都在使用 Windows 和 Linux 大小计算)和“二进制或 ASCII 传输问题”。
关于第二个问题,我也很难相信这是事实,因为尽管 3 个有问题的文件中 2 个是软件,另一个是二进制文件,但第四个文件也是二进制文件,而且没有任何问题。(其他 3 个文件是压缩的 .tar.gz,我猜也是二进制文件,但它们被正确下载了)
但让我们假设情况确实如此:我必须指定两种下载方法中的一种。那么,我该如何在通过浏览器下载和通过 QNetworkAccessManager 下载时执行此操作呢?
如果事实并非如此,那么到底发生了什么?
答案1
好吧,看来我们设法找到了问题 - 毕竟,这是 ASCII 或二进制问题。
问题首次出现时,我们通过 FileZilla 将文件发送到 FTP 服务器,传输模式为“自动”。使用 FileZilla 下载时,传输也设置为“自动”,因此出现了问题。浏览器和 Qt 的 QNetworkAccessManager 使用的传输模式未知,因此都出现了问题。
因此,我的团队测试了使用二进制文件使用 FileZilla 下载;失败。然后我们使用 ASCII 下载 - 成功。因此,现在我们删除了服务器中的文件,并使用 ASCII 上传了其中一个有问题的文件,并使用 FileZilla 和 ASCII 下载了它 - 成功。然后我们使用二进制文件上传它,并使用 FileZilla 使用二进制文件下载 - 成功。但是当使用我的基于 Qt 的应用程序下载时 - 失败。因此,我们猜测 QNetworkAcessManager 使用 ASCII 下载,这意味着我必须将其重新配置为以二进制文件下载,或者使用 ASCII 将文件上传到 FTP 服务器。由于后一种选择会在计算文件大小时给我带来问题,因此如果可能的话,我们将采用第一种解决方案。(我们还使用似乎使用二进制文件的浏览器成功下载了)。
就是这样:似乎 QNetworkAccessManager 使用 ASCII 下载,因此,如果稍后要使用 QNetworkAcessManager 下载文件,则任何上传到 FTP 服务器的文件都需要以 ASCII 格式进行下载。
编辑:这是我的失误。QNetworkAccessManager 实际上使用二进制而不是 ASCII 进行下载。当然,这导致我不得不重新评估我对如何解决问题的解释,但很明显,ASCII 或二进制是造成所有混乱的原因。
编辑 2:问题解决了。本质上,我们要做的就是确保数据将以二进制形式上传到 FTP 服务器;由于 QNAM 以二进制形式下载,因此数据应该没问题。有趣的是:这似乎只在 Linux 下有效。如果我在 Windows 中运行基于 Qt 的下载应用程序,问题仍然存在。
编辑 3:Windows 中的问题已解决:这是一个配置问题,与此问题无关。