MD5 某些文件的校验和随 FTP 升级/下载而更改


MD5 Checksum of certain files changes with FTP Up-/Download

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

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

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

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

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

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

感谢您的帮助!

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

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

默认文件类型为 FTP。ASCII_FILE_TYPE是否从不调用此方法。

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

FTPClient.setFileType(FTP.BINARY_FILE_TYPE);

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

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

我没有评论,所以我作为答案发布。我之前在我的一个项目中遇到过这个问题,FTP 客户端曾经在 ASCII 模式下添加换行符。

请参阅以下链接以获取更多信息https://superuser.com/questions/39520/downloading-files-with-filezilla-result-in-newline-r-n-n