Ответ 1
Я не думаю, что есть способ скопировать файлы без загрузки и повторной загрузки, по крайней мере, я не нашел ничего подобного в Список FTP-команд и ни один клиент, которого я видел, не поддерживал что-то вроде этого.
Мне нужно загрузить тот же файл в 2 разных места на одном FTP. Есть ли способ скопировать файл на FTP в другое место, а не загружать его снова? Спасибо.
Я не думаю, что есть способ скопировать файлы без загрузки и повторной загрузки, по крайней мере, я не нашел ничего подобного в Список FTP-команд и ни один клиент, которого я видел, не поддерживал что-то вроде этого.
Не существует стандартного способа дублирования удаленного файла по протоколу FTP. Некоторые FTP-серверы поддерживают собственные или нестандартные расширения для этого.
Некоторые FTP-клиенты поддерживают удаленное дублирование файлов. Используя расширения или временную локальную копию удаленного файла.
Например, WinSCP FTP-клиент поддерживает дублирование, используя команды перетаскивания и команды меню/клавиатуры:
SITE CPFR
/CPTO
(поддерживается, например, модулем ProFTPD mod_copy)(Я автор WinSCP)
Другой обходной путь - открыть второе подключение к FTP-серверу и заставить сервер выгружать файл себе, передавая соединение для передачи данных в пассивном режиме в соединение для передачи данных в активном режиме. Это решение показано в ответе @SaadAchemlal. Это в основном использование протокола FXP, но для одного сервера. Хотя многие FTP-серверы отклонят это, поскольку они не разрешают подключение к данным с адреса, отличного от адреса клиента.
Примечание: люди часто путают движение с копией. Если вы действительно хотите переехать, тогда это совершенно другой вопрос. Перемещение файла на FTP широко поддерживается.
Да, сам протокол FTP может теоретически поддерживать это. FTP RFC 959 обсуждает это в разделе 5.2 (см. Параграф, начинающийся с "Когда данные должны быть переданы между двумя серверами, A и B..".). Тем не менее, я не знаю ни одного клиента, который предлагает эту операцию с двумя серверами.
Обратите внимание, что этот метод может передать файл с FTP-сервера самому себе, используя свою собственную сеть, которая не будет такой быстрой, как локальная копия файла, но почти наверняка будет быстрее, чем загрузка и повторная загрузка файла.
Я могу копировать файлы между удаленными папками в системах на базе Linux. В моем конкретном случае я использую очень распространенный файловый менеджер PCManFM:
Это немного медленнее, поэтому я думаю, что это может быть загрузка и загрузка файлов, но это сделано автоматически и очень удобно.
Приведенный ниже код позволяет FTP-серверу загружать файл сам по себе (используя loopback-соединение). Для 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");
}
Мне удалось это сделать, используя WebDrive для монтирования ftp как локальной папки, а затем "загрузить" файлы с помощью filezilla непосредственно в папку. Это было немного медленнее, чем обычно загрузка, но вам не нужно иметь место на вашем hdd.
Переименование действительно сработало! В delphi:
clFTP.Rename(lbList.Items[lbList.ItemIndex], '/z/a.txt');
FillDirList();
Вы можете сделать это с C-Panel.
Готово!
Вы можете переименовать файл, который будет скопирован в полный путь к вашему желаемому результату.
Например: Если вы хотите переместить файл "file.txt" в папку "NewFolder", вы можете записать его как
ftp> rename file.txt NewFolder/file.txt
Это сработало для меня.