2009-07-03 14 views
8

Necesito transferir archivos a mi servidor web para su procesamiento y me gustaría hacerlo de forma genérica si es posible.Java File Transfer API

tengo que ser capaz de transferir archivos de los siguientes protocolos como mínimo (con más de seguir con el tiempo):

HTTP
FTP
SCP

realmente me gustaría poder para enviar archivos a SMTP también

Así que mi pregunta, ¿hay un kit de herramientas disponible que hace esto ya? Si es así, debe ser de código abierto ya que es parte de un proyecto de código abierto.

Si no hay un juego de herramientas que ya lo haga, ¿cuál es la mejor manera de estructurar una interfaz que manejará la mayoría de las transferencias de archivos?

He pensado en algo como esto:

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

Y luego una fábrica que se lleva a la URL de origen o de protocolo y crea una instancia del manejador de archivo correcto.

+0

¿Tiene que ser de código abierto o está dispuesto a pagar por una solución? – amischiefr

+0

Mi proyecto en sí mismo es de código abierto. Entonces, o necesito una solución abierta o la mía propia. Empecé a integrar Apache VFS. –

Respuesta

6

Apache commons VFS habla de este problema, aunque una comprobación rápida no muestra que hará SCP o SMTP. Commons NET hace SMTP, pero no sé si podría obtener la interfaz común lista para usar. Para SCP, aquí hay algunas posibilidades.

La línea de fondo parece ser verificar la implementación de VFS y ver si hace algo por usted, quizás pueda extenderla para diferentes protocolos. Si no es apropiado, con respecto a su interfaz, probablemente quiera que todas las referencias de archivos remotos sean cadenas en lugar de objetos de archivo, y específicamente una cadena que represente un URI que apunta a la ubicación remota y que le diga qué protocolo usar.

+0

Puede ser necesario utilizar varias bibliotecas, ya que probablemente una no sea compatible con todo lo que desee. VFS admite SFTP, pero no SMTP. – Jesse

2

Estoy trabajando en un problema muy similar al suyo, no pude encontrar ninguna solución de código abierto, así que estoy tratando de esbozar una solución yo mismo. Esto es lo que se me ocurrió.

creo que debe representar inputSources y outputSources como diferentes cosas, como

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) 

Entonces usted debe tener un movimiento para describir qué entrada debe ir a la cual la salida.

class Movement{ 
     String inputId; 
     String outputId; 
} 

Una clase para describir la lista de Movimiento a realizar.

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

Y luego una clase para realizar el trabajo en sí.

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

El código que utilizaría esta operaría como esto:

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 desea intercambiar por correo nuestros puntos de vista sobre el tema, me acaba de enviar un correo electrónico a (mi seudónimo) @gmail punto com.

NOTA: El código es sólo un esbozo :-)

+0

¿Logró que esto funcionara? Estoy interesado en su progreso ya que estoy viendo algo similar – Zubair

+0

lamentablemente no tuve tiempo de hacer mucho más desde entonces, pero recuerdo haber hecho un pequeño prototipo que fue efectivo –

0

utilice JCraft. Abre el canal "sftp" y prueba eso.