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执行此操作。
做完了!
您可以将要复制的文件重命名为所需结果的完整路径。
例如:
如果要将文件" file.txt"移动到文件夹" NewFolder"中,可以将其写为
1 | ftp> rename file.txt NewFolder/file.txt |
这对我有用。