【问题标题】:Apache Commons Net FTPClient - PUT instead of STOR?Apache Commons Net FTPClient - PUT 而不是 STOR?
【发布时间】:2012-05-22 17:49:10
【问题描述】:

我正在使用 Apache commons net FTPClient 来分发文件作为批处理作业的一部分。客户端是封装的,但大致我发出以下方法调用(为简洁起见,我省略了错误处理、流处理等):

FTPClient client = new FTPClient();
client.connect("127.0.0.1", 22);
client.login("user", "password");
client.setFileType(FTP.BINARY_FILE_TYPE);
client.changeWorkingDirectory("path/");
client.storeFile("file1.txt", new ByteArrayInputStream("hello world".getBytes()));
client.disconnect();

当我发出上述命令时,以下命令被发送到 FTP 服务器:

USER zoor
PASS ********
TYPE I
CWD path/
PORT 127,0,0,1,229,72
STOR file1.txt

这很好用。但是,现在我需要将文件发送到不支持CWDSTOR 而是分别依赖CDPUT 的遗留系统。

现在我的问题是,如何让 FTPClient 使用这些命令?

我可以使用sendCommand 方法发送CD 命令,但我不确定如何使用 PUT 命令正确(正确)执行此操作(因为我还必须发送文件数据)。

注意:我意识到有比 FTP 更好的方法来分发这样的文件,但不幸的是,我的双手被束缚了。收件人正在使用 FTP,并且不愿意更改。

更新:旧系统是 AS/400 机器。

【问题讨论】:

    标签: java ftp apache-commons-net


    【解决方案1】:

    我突然想到 CD 和 PUT 实际上不是 FTP 命令,因此这个问题没有什么意义。解决方案(因为我们需要它尽快工作)是我们将文件传输到我们自己的 FTP 服务器,并且通过该服务器上的 SSH 调用脚本,将文件传输到 AS/400 机器。

    【讨论】:

      【解决方案2】:

      这应该可行,我了解您已解决该问题,但为了完整起见,您知道 AS/400 是否需要任何站点命令来存储文件。

      您返回的错误是什么?

      我定期将文件发送到 MVS/Z/OS,并且需要首先发送一些站点命令以进行存储和设置。

      站点命令如下所示:

      • 轨迹
      • 气缸主要=350 次要=300
      • RECFM=FB LRECL=1516 BLKSIZE=31836
      • CONDDISP=删除

      这是我使用的一些代码,ftp 本质上是您在示例中使用的 FTPClient。

          public boolean sendSiteCommand(String siteCmd){
          if (null == siteCmd){
              System.err.println("Warning, Null Parameter sent to sendSiteCommand, aborting...");
              return false;
          }
      
          try{
      
              return ftp.sendSiteCommand(siteCmd);
      
          }catch (Exception e){
              System.out.println("Error Occurred Sending Site Command to Remote System, aborting...");
              e.printStackTrace(System.err);
              return false;
          }
      }
      

      【讨论】:

      • 我自己找到了站点命令,但是在我的情况下不需要这...错误是当我通过 FTP 登录服务器时无法识别 CWD 和 STOR...我可以从 AS/400 文档中理解,您与理解 CD/PUT 命令的 FTP 客户端对话,当您发出这样的命令时,它会与 FTP 服务器对话,向该服务器发送 CWD 和 STOR 命令。但是,我无法直接与服务器对话,因此无法使用实际的 FTP 命令上传文件。
      【解决方案3】:

      如果您确实需要将文件作为另一个命令上传,您可以随时扩展 FTPClient 并使用不同的命令调用内部方法。它们被构建为您可以将任何字符串作为命令提供给已经存在的商店。

      例子:

          public static class OldFtpClient extends FTPClient {
              public OutputStream putFileStream(String remote) throws IOException {
                  return _storeFileStream("PUT", remote);
              }
          }
      

      课程来源可以在https://github.com/apache/commons-net/blob/master/src/main/java/org/apache/commons/net/ftp/FTPClient.java找到。

      【讨论】:

        猜你喜欢
        • 2023-04-05
        • 2015-01-17
        • 2014-03-26
        • 2016-03-16
        • 2013-06-11
        • 2012-03-31
        • 2012-03-21
        • 2013-11-21
        • 2012-07-19
        相关资源
        最近更新 更多