【问题标题】:Java File Transfer APIJava 文件传输 API
【发布时间】:2010-11-07 22:14:38
【问题描述】:

我需要将文件传输到我的网络服务器进行处理,如果可能,我希望以通用方式进行。

我至少需要能够从以下协议传输文件(最终会遵循更多协议):

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 或协议并实例化正确的文件处理程序。

【问题讨论】:

  • 它必须是开源的还是您愿意为解决方案付费?
  • 我的项目本身就是开源的。所以要么我需要一个开放的解决方案,要么自己动手。我已经开始集成 Apache VFS。

标签: java file-io


【解决方案1】:

Apache commons VFS 谈到了这个问题,尽管快速检查并没有显示它会执行 SCP 或 SMTP。 Commons NET 执行 SMTP,但我不知道您是否可以开箱即用地获取通用接口。对于SCP,这里有一些可能性。

底线似乎是检查 VFS 实现,看看它是否对你有用,也许你可以将它扩展为不同的协议。如果不合适,关于您的接口,您可能希望所有远程文件引用都是字符串而不是文件对象,特别是表示指向远程位置并告诉您使用什么协议的 URI 的字符串。

【讨论】:

  • 可能需要使用多个库,因为一个库可能无法支持您想要的所有内容。 VFS 支持 SFTP,但不支持 SMTP。
【解决方案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 dot com。

注意:代码只是一个草图:-)

【讨论】:

  • 你设法让它工作了吗?我对你的进展很感兴趣,因为我正在寻找类似的东西
  • 不幸的是,从那以后我没有时间做太多事情,但我记得我做了一个很有效的小原型
【解决方案3】:

我认为JSch 实现了 SCP,因此涵盖了那个。

【讨论】:

    【解决方案4】:

    请使用 JCraft 。打开“sftp”频道试试看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多