我需要将同一个文件上传到同一个FTP中的2个不同位置。有没有办法将FTP上的文件复制到其他地方而不是再次上传?感谢。
答案 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:
它有点慢,所以我猜它可以下载并上传文件,但它自动完成,非常用户友好。
答案 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执行此操作。
完成!
答案 9 :(得分:-4)
您可以将要复制的文件重命名为所需结果的完整路径。
例如: 如果要将文件“file.txt”移动到“NewFolder”文件夹中,可以将其写为
ftp> rename file.txt NewFolder/file.txt
这对我有用。