FTP将文件复制到同一FTP的另一个位置


FTP copy a file to another place in same FTP

我需要将同一文件上传到同一FTP的2个不同位置。 有没有办法将FTP上的文件复制到另一个位置,而不是再次上传? 谢谢。


没有通过FTP协议复制远程文件的标准方法。但是某些FTP服务器为此支持专有或非标准扩展。

一些FTP客户端确实支持远程文件复制。使用扩展名或通过远程文件的临时本地副本。

例如,WinSCP FTP客户端使用拖放和菜单/键盘命令都支持复制:

  • 它支持SITE CPFR / CPTO FTP扩展名(例如,由ProFTPD mod_copy模块支持)
  • 如果上述扩展名不可用,它会通过本地临时副本退回到自动复制。

(我是WinSCP的作者)

另一个解决方法是打开与FTP服务器的第二个连接,并通过将被动模式数据连接传递到主动模式数据连接,使服务器将文件上传到自身。 @SaadAchemlal在答案中显示了此解决方案。这基本上是使用FXP协议,但用于一台服务器。尽管许多FTP服务器会拒绝这样做,因为它们不允许与客户端的地址之间的数据连接。

旁注:人们经常将复制与移动混为一谈。如果您确实要移动,那将是一个完全不同的问题。广泛支持在FTP上移动文件。


我认为没有一种无需下载和重新上传即可复制文件的方法,至少我在FTP命令列表中找不到类似的东西,而且到目前为止,我还没有客户端支持这种东西。


是的,FTP协议本身在理论上可以支持这一点。 FTP RFC 959在5.2节中对此进行了讨论(请参阅以"当要在两个服务器A和B之间传输数据时..."开头的段落)。但是,我不知道有任何提供这种双服务器控制操作的客户端。

请注意,此方法可以使用自己的网络将文件从FTP服务器传输到自身,这不会像本地文件副本那样快,但是几乎可以肯定比下载然后重新上传文件要快。


下面的代码使FTP服务器可以将文件上传到自身(使用回送连接)。它需要FTP服务器同时允许被动和主动连接模式。

如果您想了解ftp命令,请参见以下列表:ftp命令列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function copyFile($filePath, $newFilePath)
{
    $ftp1 = ftp_connect('192.168.1.1');
    $ftp2 = ftp_connect('192.168.1.1');
    ftp_raw($ftp1,"USER ftpUsername");
    ftp_raw($ftp1,"PASS mypassword");
    ftp_raw($ftp2,"USER ftpUsername");
    ftp_raw($ftp2,"PASS mypassword");

    $res = ftp_raw($ftp2,"PASV");
    $addressAndPort = substr($res[0], strpos($res[0], '(') + 1);
    $addressAndPort = substr($addressAndPort, 0, strpos($addressAndPort, ')'));

    ftp_raw($ftp1,"CWD ." . dirname($newFilePath));
    ftp_raw($ftp2,"CWD ." . dirname($filePath));
    ftp_raw($ftp1,"PORT".$addressAndPort);

    ftp_raw($ftp1,"STOR" . basename($newFilePath));
    ftp_raw($ftp2,"RETR" . basename($filePath));

    ftp_raw($ftp1,"QUIT");
    ftp_raw($ftp2,"QUIT");
}


我可以在基于Linux的系统中的远程文件夹之间复制文件。
在我的特定情况下,我使用的是非常常见的文件管理器PCManFM:

  • 菜单"转到"->"连接到服务器"
  • FTP登录信息等
  • 在PCManFM中打开新标签
  • 连接到同一台服务器
  • 从标签复制到标签...

它有点慢,所以我想它可以下载和上传回文件,但是它是自动完成的,非常用户友好。


我设法通过使用WebDrive将ftp作为本地文件夹挂载,然后使用filezilla直接将文件"下载"到该文件夹??来完成此操作。它比通常的下载速度慢一点,但是您不需要在硬盘上留有空间。


您可以从C-Panel执行此操作。

  • 登录到您的C-Panel。
  • 进入文件管理器。
  • 查找您要复制的文件或文件夹。
  • 右键单击并选择复制。
  • 输入要复制到的新导演。
  • 做完了!


    您可以将要复制的文件重命名为所需结果的完整路径。

    例如:
    如果要将文件" file.txt"移动到文件夹" NewFolder"中,可以将其写为

    1
    ftp> rename file.txt NewFolder/file.txt

    这对我有用。