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

27

我需要将同一个文件上传到FTP的两个不同位置。是否有一种方法可以将文件从FTP复制到另一个位置,而不是再次上传它?谢谢。

9个回答

22

在FTP协议中,没有标准方法可以复制远程文件。但是,一些FTP服务器支持专有或非标准扩展来实现此功能。


一些FTP客户端支持远程文件复制,可以通过扩展或者使用临时本地副本来实现。例如WinSCP FTP客户端通过拖放和菜单/键盘命令支持复制
- 它支持SITE CPFR/CPTO FTP扩展(例如ProFTPD mod_copy模块支持)。 - 如果上述扩展不可用,则自动通过本地临时副本进行复制。 (我是WinSCP的作者)
另一个解决方法是打开第二个连接到FTP服务器,并通过将被动模式数据连接传输到主动模式数据连接来使服务器上传文件到自身。该解决方案在@SaadAchemlal的答案中显示。这基本上是使用FXP协议,但只适用于一个服务器。尽管许多FTP服务器会拒绝此操作,因为它们不允许与客户端地址不同的地址进行数据连接。

顺便提一下:人们经常混淆移动复制。如果你真的想要移动,那就是完全不同的问题了。在FTP上移动文件得到了广泛支持。


10
感谢你提供如此棒的工具WinSCP。 - Fatih

14

我认为没有一种方法可以在不下载和重新上传的情况下复制文件,至少我在FTP命令列表中找不到任何类似的内容,并且迄今为止我见过的客户端都不支持这样的功能。


9
是的,FTP协议本身理论上支持此功能。 FTP RFC 959在5.2节中讨论了这个问题(参见以“当数据在两个服务器A和B之间传输时…”开头的段落)。然而,我不知道任何客户端提供这种双服务器控制操作。
请注意,这种方法可以使用自己的网络将文件从FTP服务器传输到自身,这不会像本地文件复制那样快,但几乎肯定比下载再上传文件要快。

1
我想知道如果你使用了这个并指定了本地主机,是否可以避开这个小瓶颈。即便如此,我们需要考虑到许多FTP服务器会阻止FXP(也称为服务器之间的传输),因为存在“FTP反弹攻击”。但是一个聪明的FTP服务器不会阻止本地主机的FXP。尽管如此,它可能会阻止所有的FXP。 - SilentSteel

1
我可以在基于Linux的系统中在远程文件夹之间复制文件。 在我的情况下,我使用非常常见的文件管理器PCManFM:
  • 菜单“Go”-->“Connect to server”
  • FTP登录信息等
  • 在PCManFM中打开新标签页
  • 连接到同一服务器
  • 从一个标签页复制到另一个标签页...
它有点慢,所以我猜它可能会下载并上传文件,但它是自动完成并非常用户友好的。

1
下面的代码使FTP服务器将文件上传到自身(使用回环连接)。它需要FTP服务器允许被动和主动连接模式。
如果您想了解ftp命令,这里有一个列表:ftp命令列表
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");
}

0

我通过使用WebDrive将FTP挂载为本地文件夹,然后直接使用FileZilla将文件“下载”到该文件夹中来完成了这个操作。虽然速度比正常下载要慢一些,但你不需要在硬盘上占用空间。


我认为它仍将临时下载文件到您的计算机,然后立即上传到您的网络驱动器。我怀疑您仍需要足够的磁盘空间来实现这一点。 - Simon East

0

以下是使用 PHP cUrl 的另一种解决方法,通过从本地机器提供参数并报告结果来执行服务器上的复制请求:

本地代码: 在这个简单的测试例程中,我想将倾斜的塔照片复制到正确的文件夹 Pisa 中:

$ch = curl_init();
$data = array ('pic' => 'leaningtower', 'folder' => 'Pisa');
curl_setopt($ch, CURLOPT_URL,"http://travelphotos.com/copypic.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch,  CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
echo $result;

服务器代码(copypic.php): 在远程服务器上,我进行了简单的错误检查。在这个服务器上,我必须调整路径标识,即,我必须使用“./”作为可接受的路径引用,因此您可能需要稍微调整一下它。
$pic = $_POST["pic"];
$folder = $_POST["folder"];
if (!$pic || !$folder) exit();

$sourcePath = "./unsortedpics/".$pic.".jpg";
$destPath =   "./sortedpics/".$folder."/".$pic.".jpg";

if (!file_exists($sourcePath )) exit("Source file not found");
if (!is_dir("./sortedpics/".$folder)) exit("Invalid destination folder");
if (!copy($sourcePath , $destPath)) exit("Copy not successful");
echo "File copied";

-2

您可以通过 C-Panel 完成此操作。

  1. 登录您的 C-Panel。
  2. 进入文件管理器。
  3. 找到您想要复制的文件或文件夹。
  4. 右键单击并选择复制。
  5. 输入您想要复制到的新目录。

完成!


4
  1. 不要在你的帖子中留下“签名”,那是你个人资料的作用。
  2. C-Panel 只在非常特殊的情况下可用。
- Glorfindel

-3

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

例如: 如果您想将文件“file.txt”移动到文件夹“NewFolder”中,可以这样写:

ftp> rename file.txt NewFolder/file.txt

这对我有用。


1
这个回答没有理解问题的重点 - 楼主明确询问的是“复制”,而不是“移动”。 - codeling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接