2010-09-28 121 views

回答

9

我不認爲有一種方法可以在不下載和重新上傳的情況下複製文件,至少我在List of FTP commands中沒有發現任何類似的內容,也沒有我見過的客戶端支持類似的內容。

9

是的,FTP協議本身在理論上可以支持這一點。 FTP RFC 959在第5.2節中討論了這一點(請參閱以「當數據在兩臺服務器之間傳輸時,A和B ...」開頭的段落)。但是,我不知道任何提供這種雙服務器控制操作的客戶端。

請注意,此方法可以使用自己的網絡將文件從FTP服務器傳輸到自己,這不會像本地文件副本那樣快,但幾乎肯定會比下載然後重新上傳文件更快。

+1

不知你用這個和指定本地主機,如果你能得到周圍輕微的瓶頸。即便如此,由於「FTP反彈攻擊」,我們需要考慮許多FTP服務器阻止FXP(也稱爲服務器到服務器的傳輸)。但是一個聰明的FTP服務器不會爲本地主機阻塞它。不過,它可能會阻止所有FXP。 – SilentSteel 2013-10-18 07:45:10

0

我設法做到這一點,使用WebDrive將ftp掛載爲本地文件夾,然後使用filezilla將文件直接「下載」到文件夾中。這比正常下載慢了一點,但你不需要在你的硬盤上有空間。

+0

我認爲它會暫時將文件下載到您的機器,然後立即將其上傳到您的網絡驅動器。我懷疑你仍然需要足夠的磁盤空間來實現這一點。 – 2015-11-19 06:34:43

-4

您可以重命名要複製到想要的結果的完整路徑的文件。

例如: 如果要移動的文件「file.txt的」到文件夾「NewFolder」你可以把它寫成

ftp> rename file.txt NewFolder/file.txt 

這爲我工作。

+1

這錯過了問題的重點 - OP明確詢問*複製*,而不是*移動* – codeling 2014-08-28 07:37:08

1

我可以在基於Linux的系統中的遠程文件夾之間複製文件。 在我的具體情況,我用很普通的文件管理器PCManFM:

  • 菜單「開始」 - >「連接到服務器」
  • FTP登錄信息等
  • 打開新的標籤PCManFM
  • 連接到同一臺服務器
  • 從標籤到標籤
  • 複製...

這是一個有點慢,所以我想,它可以被下載和上傳回文件,但它會自動完成並且非常用戶友好。

13

沒有通過FTP協議複製遠程文件的標準方法。一些FTP服務器支持專有或非標準擴展。


某些FTP客戶端確實支持遠程文件複製。使用擴展名或通過遠程文件的臨時本地副本。

例如WinSCP FTP client確實support the duplication同時使用拖&降和菜單/鍵盤命令:

  • 它支持SITE CPFR/CPTO FTP擴展
  • 它回退到一個(由ProFTPD mod_copy module支持例如)如果上述擴展名不可用,則通過本地臨時副本自動複製。

(我的WinSCP的作者)


另一個解決辦法是打開FTP服務器的第二連接,使服務器上的文件上傳到自己通過管道被動模式數據連接到活動模式數據連接。此解決方案顯示在answer by @SaadAchemlal中。

+6

我想感謝你的WinSCP真棒工具。 – Fatih 2016-03-14 10:18:58

-2

您可以通過C-Panel進行此操作。

  1. 登錄到您的C-Panel。
  2. 進入文件管理器。
  3. 找到您想要複製的文件或文件夾。
  4. 右鍵單擊並選擇「複製」。
  5. 輸入您要複製到的新導演。

完成!

+4

1)不要在您的帖子中留下'簽名',這是您的個人資料所在的位置2)C-Panel僅適用於特定情況。 – Glorfindel 2017-01-12 16:47:30

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

@MartinPrikryl那麼讓我告訴你它的確行得通,因爲我在Synology Nas上使用這個人。此外,它確實回答了這個問題,因爲您只需要將文件上傳到FTP一次,並使用我的功能將其複製到任何地方,而無需再次上傳。 請在下次嘗試測試解決方案後再說它不會工作:) – 2017-10-17 13:24:00

+0

對不起,您是對的,我沒有仔細閱讀代碼。雖然下一次,請在您的帖子中加入一些解釋,以避免混淆。 +1 +我已將你的答案與我的聯繫起來。 – 2017-10-17 14:29:41

+0

我會盡力在下次解釋更多。感謝編輯;) – 2017-10-17 19:53:32

相關問題