2012-04-17 154 views
2

我正在編寫涉及多個客戶端的應用程序。一個客戶端使用FTP將文件上傳到服務器,然後另一個客戶端下載該文件並將其刪除。我使用FTP服務器作爲中間人來交換信息,因爲我不希望用戶必須前移端口。我已經想出瞭如何上傳文件,但我無法弄清楚如何刪除文件。使用FTP刪除文件的命令是:使用Java從FTP服務器刪除文件

DELE <filename> 

我試過這樣做,但沒有成功。這裏是我試過的代碼:我有一種感覺,<文件名>我提供的可能是錯誤的,因爲我並沒有包括在路徑的目錄名

public static void deleteFile(String name) throws IOException 
{ 
    URL url = new URL("ftp://a1111111:[email protected]/public_html/misc/screenshots/picture.png;type=i"); 
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(url.openConnection().getOutputStream())); 
    writer.write("DELE picture.png"); 
    writer.flush(); 
} 

。但是,由於我明確告訴URL中文件的路徑,所以我不太確定我應該爲<文件名>輸入什麼內容。

我已經閱讀了本網站上有關與此非常相似的問題的其他問題,並且所有的答案都告訴了使用一個庫。問題是,大多數這些庫都是用純Java編寫的,因此該庫的開發人員必須找出一種方法來實現我在沒有庫的情況下要做的事情。我也想這樣做。我不喜歡附加額外的文件,除了我自己的東西,我做的。所以,請不要告訴我使用庫 - 這不是我要找的。

如果您需要任何澄清,請詢問!

編輯:如果我使用此代碼收到答覆:

byte[] response = new byte[conn.getInputStream().available()]; 
    conn.getInputStream().read(response); 
    System.out.println("Response: " + new String(response)); 

我的命令只是獲取回送:

Response: DELE test1.png 
+0

你確信你可以從一個有趣的'URL'對象實際運行多個FTP命令('GET' _and_'DELE')嗎?這對我來說似乎不太可能。拋出什麼異常或服務器的回覆是什麼? (如果你還沒有運行Wireshark來觀察事務) – sarnold 2012-04-17 02:52:25

+0

我不確定這是否正常,但是在寫入DELE命令後,我從通過連接建立的輸入流中收到68。編輯:在用不同的代碼嘗試響應之後,輸入流只是迴應我寫入的內容。 – 2012-04-17 03:02:59

+1

'68'?那很好笑。 [FTP狀態碼長度爲三位數字。](http://www.ietf.org/rfc/rfc959.txt)。 – sarnold 2012-04-17 03:08:49

回答

1

我認爲你需要做的檢索和刪除兩個獨立的操作; some random documentation I found for FtpURLConnection部分地說:

此類在給定URL的情況下打開FTP輸入(或輸出)流。它可以作爲一個一杆FTP傳輸:

登錄
獲取(或PUT)文件
斷開

我沒有看到,將允許刪除文件的文檔中的任何方法。

您可能希望使用URL機制來檢索文件,但我會下拉到使用原始套接字來刪除該文件。創建到FTP命令端口的新連接,登錄並手動發出DELE命令。如果這是您採取的唯一步驟,那麼您可能能夠避免執行相對較差的錯誤處理,並且可能只需要兩個請求,並在完成後直接向用戶顯示輸出副本。

這有點髒,但我完全明白,不想攜帶一兆字節的額外資源來達到echo -e "user foo\npass password\ndele /path/to/file\nlogout" | nc ftp.remote.example.com 21的道德等值。

+0

我將如何去建立一個使用FTP的服務器套接字連接? – 2012-04-17 03:27:13

+1

只需閱讀[RFC 959,FTP規範](http://www.ietf.org/rfc/rfc959.txt)。很多其他人已經用Java爲你實現了它。 – BalusC 2012-04-17 03:39:35