2009-07-03 57 views
8

我需要將文件傳輸到我的Web服務器進行處理,如果可能,我希望以通用方式進行處理。Java文件傳輸API

我需要能夠至少從以下協議傳輸文件(有更多的最終跟隨):

HTTP
FTP
SCP

我真的希望能夠發送文件到SMTP也

所以我的問題,是否有一個工具包可以這樣做呢?如果是這樣,它必須是開源的,因爲這是開源項目的一部分。

如果沒有工具包已經做到這一點,那麼構建一個能夠處理大多數文件傳輸的接口的最佳方法是什麼?

我想過這樣的事情:

public interface FileTransfer { 
    public void connect(URL url, String userid, String password); 
    public void disconnect(); 
    public void getFile(String sourceFile, File destFile); 
    public void putFile(File sourceFile, File destFile); 
} 

然後,是以源URL或協議並實例正確的文件處理程序的工廠。

+0

它是否必須是開源的或你願意爲解決方案付費? – amischiefr 2009-07-03 12:39:49

+0

我的項目本身就是開源的。所以無論我需要一個開放的解決方案還是自己推出。我已經開始整合Apache VFS。 – 2009-07-04 22:12:12

回答

6

Apache commons VFS說明了這個問題,雖然快速檢查並未顯示它會執行SCP或SMTP。 Commons NET確實SMTP,但我不知道你可以獲得開箱即用的通用界面。對於SCP,這裏有一些可能性。

底線似乎是檢查VFS實現,看看它是否爲你做了什麼,也許你可以擴展它爲不同的協議。如果它不合適,關於你的接口,你可能會希望所有的遠程文件引用都是Strings而不是File對象,特別是一個表示指向遠程位置的URI的字符串,並告訴你使用什麼協議。

+0

可能有必要使用多個庫,因爲一個庫可能不支持你想要的任何東西。 VFS確實支持SFTP,但不支持SMTP。 – Jesse 2009-07-03 13:07:39

2

我正在處理與您非常相似的問題,我無法找到任何開源解決方案,因此我正在嘗試自己繪製解決方案。這是我想出來的。

我想你應該代表inputSources和outputSources不同的東西,比如

public interface Input{ 
     abstract InputStream getFileInputStream(); 
     abstract String getStreamId(); 
} 
//You can have differen implementation of this interface (1 for ftp, 1 for local files, 1 for Blob on db etc) 

public interface Output{ 
     abstract OutputStream getOutputStream(); 
     abstract String getStreamId(); 
} 
//You can have differen implementation of this interface (1 for ftp, 1 for local files, 1 for mailing the file etc) 

那麼你應該有一個運動來描述輸入應該去哪個輸出。

class Movement{ 
     String inputId; 
     String outputId; 
} 

一個類來描述運動列表。

class MovementDescriptor{ 
     public addMovement(Movement a); 
     public Movement[] getAllMovements(); 
} 

然後一個類來執行工作本身。

class FileMover{ 

     HashMap<String,Input> inputRegistry; 
     HashMap<String,Output> outputRegistry; 

     addInputToRegistry(Input a){ 
      inputRegistry.put(a.getId(),a); 
     } 
    addOutputToRegistry(Output a){ 
      outputRegistry.put(a.getId(),a); 
     } 

    transferFiles(MovementDescriptor movementDescriptor){ 

     Movement[] movements =movementDescriptor.getAllMovements(); 
     foreach (Movement movement: movements){ 
       //get the input Id 
       //find it in the registry and retrieve the associated InputStream 
       //get the output Id 
       //find it in the registry and retrieve the associated OutputStream 
       //copy the stream from the input to the output (you may want to use a temporary file in between) 
      } 
    } 
} 

,將使用這將是這樣操作的代碼:

FileMover fm=new FileMover(); 

//Register your sources and your destinations 
fm.addInputToRegistry(input); 
fm.addOutputToRegistry(output) 

// each time you have to make a movement create a MovementDescriptor and call 
fm.transferFiles(movementDescriptor) 

如果您想通過電子郵件給我們的意見關於這個問題的交流,只是給我發郵件,在(我的小名) @gmail點com。

注:該代碼只是一個草圖:-)

0

請使用JCraft。打開「sftp」頻道並嘗試。