2009-07-03 27 views
8

Tôi cần chuyển tệp tới máy chủ web của mình để xử lý và tôi muốn thực hiện theo cách chung chung nếu có thể.API chuyển tệp Java

tôi cần để có thể chuyển các tập tin từ các giao thức sau ở mức tối thiểu (với hơn để làm theo cuối cùng):

HTTP
FTP
SCP

Tôi thực sự muốn để có thể để gửi tệp tới SMTP cũng

Vì vậy, câu hỏi của tôi, có bộ công cụ có sẵn để thực hiện việc này không? Nếu vậy, nó phải là nguồn mở vì đây là một phần của dự án nguồn mở.

Nếu không có bộ công cụ nào đã thực hiện việc này, cách tốt nhất để cấu trúc giao diện sẽ xử lý hầu hết chuyển tệp là gì?

Tôi đã nghĩ về một cái gì đó như thế này:

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

Và sau đó một nhà máy mà sẽ đưa URL nguồn hoặc giao thức và instantiates xử lý tập tin chính xác.

+0

Bạn có phải là nguồn mở hoặc bạn sẵn sàng trả tiền cho giải pháp không? – amischiefr

+0

Dự án của tôi là chính nguồn mở. Vì vậy, hoặc tôi cần một giải pháp mở hoặc cuộn của riêng tôi. Tôi đã bắt đầu tích hợp Apache VFS. –

Trả lời

6

Apache commons VFS nói về vấn đề này, mặc dù kiểm tra nhanh không cho thấy rằng nó sẽ thực hiện SCP hoặc SMTP. Commons NET thực hiện SMTP, nhưng tôi không biết rằng bạn có thể lấy giao diện chung ra khỏi hộp. Đối với SCP, đây là một số khả năng.

Dòng dưới cùng có vẻ là để kiểm tra việc thực hiện VFS và xem nếu nó làm điều gì đó cho bạn, có lẽ bạn có thể mở rộng nó cho các giao thức khác nhau. Nếu nó không thích hợp, liên quan đến giao diện của bạn, bạn có thể muốn tất cả các tham chiếu tập tin từ xa là các chuỗi thay vì đối tượng File, và cụ thể là một chuỗi đại diện cho một URI trỏ đến vị trí từ xa và cho bạn biết giao thức nào cần sử dụng.

+0

Có thể cần phải sử dụng nhiều thư viện, vì một thư viện có thể sẽ không hỗ trợ mọi thứ bạn muốn. VFS không hỗ trợ SFTP, nhưng không hỗ trợ SMTP. – Jesse

2

Tôi đang làm việc tại một vấn đề rất giống với của bạn, tôi không thể tìm thấy bất kỳ giải pháp nguồn mở nào vì vậy tôi đang cố gắng phác họa một giải pháp cho bản thân mình. Đây là những gì tôi đã đưa ra.

Tôi nghĩ bạn nên đại diện cho inputSources và outputSources như những thứ khác nhau, như

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) 

Sau đó, bạn nên có một phong trào để mô tả mà đầu vào nên đến đó sản lượng.

class Movement{ 
     String inputId; 
     String outputId; 
} 

Lớp học để mô tả danh sách Chuyển động thực hiện.

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

Và sau đó là một lớp học để tự thực hiện công việc.

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

Các mã mà sẽ sử dụng này sẽ hoạt động như thế này:

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) 

Nếu bạn muốn trao đổi qua đường bưu điện quan điểm của chúng tôi về chủ đề này, chỉ cần gửi cho tôi một email tại (biệt danh của tôi) @gmail dot com.

Chú ý: Mã này chỉ là một phác thảo :-)

+0

Bạn có quản lý để làm việc này không? Tôi quan tâm đến sự tiến bộ của bạn khi tôi đang xem một cái gì đó tương tự như – Zubair

+0

tiếc là tôi không có thời gian để đi nhiều kể từ đó, nhưng tôi nhớ đã thực hiện một mẫu thử nghiệm nhỏ mà đã có hiệu quả –

0

Tôi nghĩ JSch thực hiện SCP, do đó bao gồm một.

0

hãy sử dụng JCraft. Mở kênh "sftp" và thử điều đó.

Các vấn đề liên quan