在 FTP LIST 中表示未知文件大小的方法?

Way to represent unknown file size in FTP LIST?

我在生成合成文件的设备上有一个 FTP 服务器 运行。即文件实际上并不存在于文件系统中。每当请求下载时,它都会即时生成。它的大小在生成之前是未知的。

某些 FTP 客户端(例如 Windows Explorer)显然使用来自 FTP LIST 命令的信息来确定下载后的预期文件大小。当我请求下载时,Windows Explorer 首先尝试服务器不支持的 FTP SIZE 扩展 (RFC 3659)。然后它下载整个文件(我在 Wireshark 中看到了全部内容),但它会将文件截断为 LIST 中报告的大小。

这里的预期行为是什么? Windows Explorer 使用此优化/安全措施是否超出规范?

我们当前的解决方法是将文件大小显示为大于文件列表中的大小。

有没有办法在 ls -l / FTP LIST 中表示未知文件大小?正如我所读 RFC 959, the LIST format is not standardized, but I'm guessing the POSIX ls '-l' 格式很常见,Windows Explorer 正在解析它。

我应该如何处理这种情况?

What is the expected behavior here? Is Windows Explorer acting outside of spec with this optimization / safety measure?

规范没有说明根据传输的大小检查文件大小,但如果您严格遵守规范,您将不知道文件是否已完全传输。您在客户端上所能得到的只是数据连接已关闭,但这也可能是因为服务器端出现问题。 所以客户正在尝试解决这些限制。

Is there a way to represent an unknown file size in an 'ls -l' / FTP LIST? As I read RFC 959, the LIST format is not standardized, but I'm guessing the POSIX format is pretty common, and that Windows Explorer is parsing that.

是的,没有标准格式,但通常使用 ls -l 的输出。由于这涉及到具有静态文件的文件系统,这些文件都具有已知的文件大小,因此无法提供 "unknown" 之类的大小。但是由于格式不是标准化的,你可能会尝试简单地给出文件列表,没有任何大小(就像 NLST)。

除此之外,您的客户端只是实现了 FTP 的典型用例,即传输静态文件。在这种情况下,文件大小是已知的。但是您以非典型的方式使用 FTP,因此您必须处理这些未达到的期望和作弊。由于 FTP 在涉及防火墙或专用网络时无论如何都是一场噩梦,您最好切换到其他广泛使用的协议,如 HTTP 或 WebDAV。

客户端的解决方法是使用 wget 或 'ftp' 命令。 'ftp' 命令示例:

  1. 打开控制台
  2. ftp user@yourserver
  3. cd to_your_path
  4. 获得your_filename.

因为 wget 和 'ftp get command' 都不需要大小来下载文件。

另一种解决方案可能是使用自己的 ftp 服务器。您可以找到许多具有基本功能、GUI 客户端支持和简单脚本语言代码的服务器,例如 php。更改此功能的代码很简单。我对其中一个项目做了同样的事情。