我正在使用Apache Commons NET及其FTPClient。
现在我的情况:我在服务器上有一个文件,并且本地在同一层次结构中有相同的文件。在服务器上,我使用PHP的md5_file()生成文件的MD5-Checksum。在我的机器上,我使用Apache Commons Digest Utils生成MD5-Checksum md5hex()。
那些MD5-Hashes实际上总是匹配 - 除了某些文件。
其中一个文件是当前的jQuery-Library。这些文件中的另一个是.ttf字体文件,另一个是常规PHP文件(来自CodeIgniter的system / libraries / Migration.php)。
现在令人惊奇的部分:如果我看到那些MD5校验和不一样,我将本地文件上传到服务器(或者我将FTP文件下载到我的电脑,取决于哪一个更新(时间戳)) 。但无论如何,在Up-或Download之后,MD5校验和仍然不一样 - 来自完全相同的文件。为什么呢?
正如我所想,时间戳可能是md5数据的一部分,但实际上这是不可能的,因为所有其他文件也会失败。
感谢您的帮助!
答案 0 :(得分:1)
我没有评论previlleages所以我发布作为答案。 我之前在我的一个项目中遇到过这种情况,用于在ASCII模式下添加换行符的FTP客户端。
有关详细信息,请参阅以下链接 https://superuser.com/questions/39520/downloading-files-with-filezilla-result-in-newline-r-n-n
答案 1 :(得分:1)
正如Jon Skeet已经提到的,发生这种情况的通常原因是文件不是以二进制方式传输,而是以ASCII模式传输。
FTPClient.setFileType()的FTPClient文档支持此功能,该文档声明:
如果永远不调用此方法,则默认文件类型为FTP.ASCII_FILE_TYPE。
要使用FTPClient以二进制模式传输文件,请在上传前调用setFileType
:
FTPClient.setFileType(FTP.BINARY_FILE_TYPE);
会话将保持二进制模式,直到您再次更改它。
顺便说一下,时间戳不是问题,它们不会影响MD5哈希值。