2009-07-03 7 views
8

J'ai besoin de transférer des fichiers sur mon serveur Web pour le traitement et je voudrais le faire de manière générique si possible.API de transfert de fichiers Java

Je dois être en mesure de transférer des fichiers à partir des protocoles suivants au minimum (avec plus de suivre éventuellement):

HTTP FTP

SCP

Je voudrais vraiment pouvoir pour envoyer des fichiers au SMTP aussi

Donc, ma question, existe-t-il une boîte à outils disponible qui le fait déjà? Si c'est le cas, il doit s'agir d'open source car cela fait partie d'un projet open source.

S'il n'existe pas encore de boîte à outils, quel est le meilleur moyen de structurer une interface qui gérera la plupart des transferts de fichiers?

J'ai pensé à quelque chose comme ceci:

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); 
} 

Et puis une usine qui prend l'URL source ou protocole et instancie le gestionnaire de fichier correct.

+0

Faut-il être open source ou êtes-vous prêt à payer pour une solution? – amischiefr

+0

Mon projet est lui-même open source. Donc, soit j'ai besoin d'une solution ouverte ou de rouler la mienne. J'ai commencé à intégrer Apache VFS. –

Répondre

6

Apache commons VFS traite de ce problème, même si une vérification rapide n'a pas montré qu'il fera SCP ou SMTP. Commons NET fait SMTP, mais je ne sais pas que vous pourriez obtenir l'interface commune hors de la boîte. Pour SCP, voici quelques possibilités. La ligne de fond semble être de vérifier l'implémentation VFS et voir si elle fait quelque chose pour vous, peut-être vous pouvez l'étendre pour différents protocoles. Si ce n'est pas approprié, en ce qui concerne votre interface, vous voudrez probablement que toutes les références de fichiers distants soient des chaînes plutôt que des objets File, et spécifiquement une chaîne représentant un URI pointant vers l'emplacement distant et vous indiquant le protocole à utiliser.

+0

Il peut être nécessaire d'utiliser plusieurs bibliothèques, car il est probable que l'une d'entre elles ne supportera pas tout ce que vous voulez. VFS prend en charge SFTP, mais pas SMTP. – Jesse

2

Je travaille sur un problème très similaire au vôtre, je n'ai pas trouvé de solution open source donc j'essaie d'esquisser une solution moi-même. C'est ce que j'ai trouvé.

Je pense que vous devriez représenter inputSources et outputSources comme des choses différentes, comme

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) 

Ensuite, vous devez avoir un mouvement pour décrire quelle entrée devrait aller à quelle sortie.

class Movement{ 
     String inputId; 
     String outputId; 
} 

Une classe pour décrire la liste des mouvements à effectuer.

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

Et puis une classe pour effectuer le travail lui-même.

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) 
      } 
    } 
} 

Le code qui utiliserait ce fonctionnerait comme ceci:

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) 

Si vous souhaitez échanger par courrier notre point de vue sur le sujet, envoyez-moi un e-mail à (mon surnom) @gmail dot com.

REMARQUE: Le code est juste un croquis :-)

+0

Avez-vous réussi à obtenir ce travail? Je m'intéresse à vos progrès car je regarde quelque chose de similaire – Zubair

+0

malheureusement je n'ai pas eu le temps d'y aller beaucoup depuis, mais je me souviens d'avoir fait un petit prototype qui était efficace –

0

Je pense que JSch implémente SCP, de sorte que couvre celui-là.

0

veuillez utiliser JCraft. Ouvrez le canal "sftp" et essayez-le.