web-dev-qa-db-ja.com

FTP同じFTP内の別の場所にファイルをコピーする

同じFTPの2つの異なる場所に同じファイルをアップロードする必要があります。もう一度アップロードする代わりに、FTP上のファイルを別の場所にコピーする方法はありますか?ありがとう。

19
Stan

ダウンロードして再アップロードせずにファイルをコピーする方法はないと思います。少なくとも FTPコマンドのリスト でこのようなものは見つかりませんでした。 。

10
schnaader

FTPプロトコルを介してリモートファイルを複製する標準的な方法はありません。一部のFTPサーバーは、このために独自のまたは非標準の拡張機能をサポートしています。


一部のFTPクライアントは、リモートファイルの複製をサポートしています。拡張機能を使用するか、リモートファイルの一時的なローカルコピーを使用します。

たとえば WinSCP FTP client複製をサポート をドラッグ&ドロップとメニュー/キーボードコマンドの両方を使用して実行します。

  • SITE CPFR/CPTO FTP拡張機能をサポートします(たとえば ProFTPD mod_copyモジュール でサポートされています)
  • 上記の拡張機能が利用できない場合は、ローカルの一時コピーを介した自動複製にフォールバックします。

(WinSCPの作成者です)


別の回避策は、FTPサーバーへの2番目の接続を開き、パッシブモードのデータ接続をアクティブモードのデータ接続にパイプすることによって、サーバーにファイルをアップロードすることです。このソリューションは answer by @SaadAchemlal に示されています。


補足:movecopyを混同することがよくあります。実際にmoveを実行したい場合、それはまったく別の質問です。 FTPでのファイルの移動は広くサポートされています。

20
Martin Prikryl

はい、理論的にはFTPプロトコル自体がこれをサポートできます。 FTP RFC 959 は、これについてセクション5.2で説明します(「2つのサーバーAとBの間でデータを転送する場合」で始まる段落を参照してください)。しかし、私はこの種の二重サーバー制御操作を提供するクライアントを知りません。

この方法では、独自のネットワークを使用してFTPサーバーからそれ自体にファイルを転送できます。これは、ローカルファイルのコピーほど高速ではありませんが、ファイルをダウンロードしてから再アップロードするよりもほぼ確実に高速です。

9
Greg Hewgill

以下のコードは、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");
}
1
Saad Achemlal

Linuxベースのシステムのリモートフォルダー間でファイルをコピーできます。私の特定のケースでは、非常に一般的なファイルマネージャーPCManFMを使用しています。

  • メニュー「移動」→「サーバーに接続」
  • FTPログイン情報など
  • PCManFMで新しいタブを開く
  • 同じサーバーに接続
  • タブからタブにコピー...

それは少し遅いので、ファイルのダウンロードとアップロードが可能であると思いますが、それは自動的に行われ、非常にユーザーフレンドリーです。

1
aesede

WebDriveを使用してローカルフォルダーとしてftpをマウントし、filezillaを使用してファイルを直接フォルダーに「ダウンロード」することで、これを行うことができました。通常のダウンロードよりも少し遅いですが、HDDにスペースを確保する必要はありません。

0
Acelasi Eu