使用 Apache FtpClient 计算 FTP 服务器中的文件校验和

Calculate file checksum in FTP server using Apache FtpClient

我正在使用 Apache Commons Net 的 FtpClient 将视频上传到 FTP 服务器。为了检查文件是否真的传输成功,我想计算远程文件的校验和,但不幸的是我发现没有相关的API可以使用。

我的问题是:ftp服务器是否需要计算文件校验和?
如果是,如何在FtpClient中获取校验和?
如果答案是否定的,那么FtpClient是如何知道文件是否真的成功完整传输的呢?

对于 FTP,我建议验证上传,如果可能

问题是没有广泛的标准 API 来计算 FTP 的校验和。

FTP的校验和计算命令有很多建议。 None 已被接受。

最新提议是:
https://datatracker.ietf.org/doc/html/draft-bryan-ftpext-hash-02

因此,不同的 FTP 服务器支持不同的校验和命令,具有不同的语法。 HASHXSHA1XSHA256XSHA512XMD5MD5XCRC 等等。您需要检查您的 FTP 服务器支持什么,如果有的话。

您可以使用 WinSCP 进行测试。 WinSCP 支持所有前面提到的命令。测试其 checksum calculation function or checksum scripting command. If they work, enable logging 并检查 WinSCP 针对您的服务器使用的命令和语法。

> 2015-04-28 09:19:16.558 XSHA1 /test/file.dat
< 2015-04-28 09:19:22.778 213 a98faefdb2c36ca352a2d9b01668aec6b641cf4b 

然后使用Apache Commons Net执行命令sendCommand method:

if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("XSHA1", "filename"))
{
    String[] reply = ftpClient.getReplyStrings();
}

(我是WinSCP的作者)


如果您的服务器不支持任何校验和命令,您没有太多选择:

  • 将文件下载回来并在本地检查。
  • 使用加密 (TLS/SSL) 时,文件在传输过程中被损坏的可能性会大大降低。否则接收方(在本例中为服务器)将无法解密数据。所以如果你确定文件传输完成(没有解密错误并且上传文件的大小与本地原始文件的大小相同),你可以确定上传的文件是正确的。

只是补充一下我是如何实现的。在处理没有加载任何附加模块以进行校验和检查的标准 ftp 服务器时,我所做的只是将每个文件的 MD5 CRC 哈希列表创建到一个 SFV 文件中。说它叫 uploads.sfv (与 sfv 生成器的格式相同)。这允许您进行进一步的校验和检查。

关于服务器端支持校验和检查支持的示例:

当然,正如@MartinPrikryl 强调的那样,none 这些都是标准化的。

希望不大,但如果服务器支持 php,您可以利用它。

将以下内容保存为 php 文件(例如,check.php),与 name_of_file.txt 文件位于同一文件夹中:

<? php
echo md5_file('name_of_file.txt');
php>

然后,访问页面 check.php,您应该会得到文件的 md5 哈希值。

相关问题: