使用 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 服务器支持不同的校验和命令,具有不同的语法。 HASH
、XSHA1
、XSHA256
、XSHA512
、XMD5
、MD5
、XCRC
等等。您需要检查您的 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 生成器的格式相同)。这允许您进行进一步的校验和检查。
关于服务器端支持校验和检查支持的示例:
- PZS-ng 为 cuftpd, glftpd
- mod_digest 对于 ProFTPD
当然,正如@MartinPrikryl 强调的那样,none 这些都是标准化的。
希望不大,但如果服务器支持 php,您可以利用它。
将以下内容保存为 php
文件(例如,check.php
),与 name_of_file.txt
文件位于同一文件夹中:
<? php
echo md5_file('name_of_file.txt');
php>
然后,访问页面 check.php
,您应该会得到文件的 md5 哈希值。
相关问题:
- FTP: copy, check integrity and delete
- How to perform checksums during a SFTP file transfer for data integrity?
- https://serverfault.com/q/98597/401691
我正在使用 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 服务器支持不同的校验和命令,具有不同的语法。 HASH
、XSHA1
、XSHA256
、XSHA512
、XMD5
、MD5
、XCRC
等等。您需要检查您的 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 生成器的格式相同)。这允许您进行进一步的校验和检查。
关于服务器端支持校验和检查支持的示例:
- PZS-ng 为 cuftpd, glftpd
- mod_digest 对于 ProFTPD
当然,正如@MartinPrikryl 强调的那样,none 这些都是标准化的。
希望不大,但如果服务器支持 php,您可以利用它。
将以下内容保存为 php
文件(例如,check.php
),与 name_of_file.txt
文件位于同一文件夹中:
<? php
echo md5_file('name_of_file.txt');
php>
然后,访问页面 check.php
,您应该会得到文件的 md5 哈希值。
相关问题:
- FTP: copy, check integrity and delete
- How to perform checksums during a SFTP file transfer for data integrity?
- https://serverfault.com/q/98597/401691