2009-07-03 25 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

+0

私のプロジェクトはそれ自身がオープンソースです。だから、私はオープンなソリューションが必要なのか、自分でロールを張るのか。私はApache VFSの統合を開始しました。 –

答えて

6

Apache commons VFSは、SCPまたはSMTPを実行することをクイックチェックで示していませんでしたが、この問題について説明しています。 Commons NETはSMTPをサポートしていますが、一般的なインターフェイスをそのまま使うことはできません。 SCPについては、いくつかの可能性があります。

結論は、VFS実装をチェックアウトして、あなたのために何かをしているかのように見えますが、おそらくあなたは別のプロトコルのためにそれを拡張することができます。適切でない場合は、おそらく、リモートファイル参照がFileオブジェクトではなくStringであることを望んでいます。具体的には、リモートロケーションを指し示すURIを表す文字列で、使用するプロトコルを教えてください。

+0

複数のライブラリを使用する必要があるかもしれません。おそらく、必要なものはすべてサポートしていないからです。 VFSはSFTPをサポートしますが、SMTPはサポートしません。 – Jesse

2

私はあなたと非常によく似た問題で取り組んでいます。私はオープンソースのソリューションを見つけることができませんでしたので、ソリューションを自分でスケッチしようとしています。これは私が思いついたものです。

私はあなたが次にあなたがどの出力に行くべき入力記述するための運動を持っている必要があり

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) 

のように、異なるものとしてInputSourceが及びoutputSourcesを表すべきだと思います。

class Movement{ 
     String inputId; 
     String outputId; 
} 

Movementのリストを記述するクラスです。

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ドットコム

注:コードはちょうどスケッチ:-)

+0

これをうまく運用できましたか?私はあなたの進歩に興味を持っています。私は何か似たものを見ています。 – Zubair

+0

残念なことに、私はその時以来多くの時間を費やす時間がありませんでしたが、効果があった小さなプロトタイプを作ったことを覚えています –

0

である私はそれが1ということをカバーしてJSchは、SCPを実装してだと思います。

0

JCraftをご利用ください。 "sftp"チャンネルを開いてみてください。