1

我正在使用Apache Commons NET和他们的FTPClient

现在我的情况是:我在服务器上有一个文件,并且在本地有相同层次结构中的相同文件。在服务器上,我使用 PHP 的md5_file()生成文件的 MD5 校验和。在我的机器上,我正在使用 Apache Commons Digest Utils md5hex()生成 MD5 校验和。

那些 MD5 哈希实际上总是匹配的——除了某些文件。

其中一个文件是当前的 jQuery-Library。其中另一个文件是 .ttf 字体文件,另一个是常规 PHP 文件(来自CodeIgniter的 system/libraries/Migration.php )。

现在令人惊奇的部分:如果我看到那些 MD5 校验和不一样,我将本地文件上传到服务器(或者我将 FTP 文件下载到我的计算机,取决于哪个更新(时间戳))。但无论如何,在上传或下载之后,MD5 校验和仍然不一样——来自完全相同的文件。为什么?

正如我所想,时间戳可能是 md5 数据的一部分,但这实际上是不可能的,因为那样所有其他文件也会失败。

感谢您的帮助!

4

2 回答 2

2

正如 Jon Skeet 已经提到的,发生这种情况的通常原因是文件不是以二进制格式传输的,而是以 ASCII 模式传输的。

FTPClient.setFileType()的 FTPClient 文档支持这一点,其中指出:

如果从不调用此方法,则默认文件类型为 FTP.ASCII_FILE_TYPE。

要使用 FTPClient 以二进制模式传输文件,请setFileType在上传前调用:

FTPClient.setFileType(FTP.BINARY_FILE_TYPE);

会话将保持二进制模式,直到您再次更改它。

顺便说一句,时间戳不是问题,它们不会影响 MD5 哈希。

于 2013-02-01T10:17:07.097 回答
1

我没有评论previlleages,所以我发布作为答案。我早些时候在我的一个项目中遇到过这个问题,FTP 客户端用于在 ASCII 模式下添加换行符。

有关更多信息,请参阅以下链接 https://superuser.com/questions/39520/downloading-files-with-filezilla-result-in-newline-rnn

于 2013-02-01T10:09:47.330 回答