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

时间:2010-09-28 00:12:04

标签: ftp

我需要将同一个文件上传到同一个FTP中的2个不同位置。有没有办法将FTP上的文件复制到其他地方而不是再次上传?感谢。

10 个答案:

答案 0 :(得分:20)

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

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

例如WinSCP FTP client使用拖放功能和菜单/键盘命令执行support the duplication

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

(我是WinSCP的作者)

另一种解决方法是打开与FTP服务器的第二个连接,并通过将被动模式数据连接管道连接到活动模式数据连接,使服务器将文件上载到自身。此解决方案显示在answer by @SaadAchemlal

旁注:人们常常将移动 copy 混淆。如果您确实想要移动,那么这是一个完全不同的问题。在FTP上移动文件受到广泛支持。

答案 1 :(得分:10)

我认为没有办法在没有下载和重新上传的情况下复制文件,至少我在List of FTP commands中找不到这样的内容,到目前为止我见过的客户端都没有这样的支持。

答案 2 :(得分:9)

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

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

答案 3 :(得分:1)

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

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

它有点慢,所以我猜它可以下载并上传文件,但它自动完成,非常用户友好。

答案 4 :(得分:1)

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

如果您想了解ftp命令,请列出以下内容:List of ftp commands

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");
}

答案 5 :(得分:0)

我设法通过使用WebDrive将ftp作为本地文件夹挂载,然后使用filezilla将文件“直接”下载到该文件夹​​。它比正常下载慢一点,但你不需要在你的硬盘上有空间。

答案 6 :(得分: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";

答案 7 :(得分:-1)

重命名真的有用! 在德尔福:

  clFTP.Rename(lbList.Items[lbList.ItemIndex], '/z/a.txt');
  FillDirList();

答案 8 :(得分:-2)

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

  1. 登录您的C-Panel。
  2. 进入文件管理器。
  3. 找到要复制的文件或文件夹。
  4. 右键单击并选择“复制”。
  5. 键入要复制到的新导演。
  6. 完成!

答案 9 :(得分:-4)

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

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

ftp> rename file.txt NewFolder/file.txt

这对我有用。