MD5某些文件的校验和随FTP Up- / Download而变化

时间:2013-02-01 09:46:19

标签: java php ftp md5 apache-commons-net

我正在使用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数据的一部分,但实际上这是不可能的,因为所有其他文件也会失败。

感谢您的帮助!

2 个答案:

答案 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哈希值。