我正在使用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