当前位置: 首页 > 知识库问答 >
问题:

Apache Commons Net FTPClient-PUT而不是STOR?

商辰钊
2023-03-14

我正在使用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机器。

共有3个答案

罗绪
2023-03-14

如果确实需要将文件作为另一个命令上载,则始终可以扩展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-03-14

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

你得到的错误是什么?

我定期发送文件到MVS/Z/OS,有一些网站命令需要首先发送存储和设置。

站点命令看起来像:

  • 小径
  • 汽缸主缸=350副缸=300
  • RECFM=FB LRECL=1516 BLKSIZE=31836
  • condisp=delete

这是我使用的一个小代码,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;
    }
}
司空俊雅
2023-03-14

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

 类似资料:
  • 这是前端部分 每次在处捕获

  • 我试图通过PHP后端更新/插入MySQL数据库中的数据。我正在用AngularJS构建前端,并使用服务与REST API通信。 我的设置如下所示: 我正在通过$http提供商设置标头: POST Call如下所示: Chrome中的开发控制台向我展示了以下内容: 当我从POST转换为PUT时,我发送的是期权看涨期权,而不是PUT。而内容类型只切换到。 我的请求有效负载作为对象发送: 如何正确设置标

  • 问题内容: 我正在工作一个内部Web应用程序。在IE10中,请求工作正常,但在Chrome中,所有AJAX请求(很多)都是使用OPTIONS发送的,而不是我提供的任何已定义方法。从技术上讲,我的要求是“跨​​域”。该站点位于localhost:6120上,我向AJAX发出请求的服务位于57124上。此关闭的jquery错误定义了该问题,但不是真正的解决方法。 如何在ajax请求中使用正确的http

  • 问题内容: 我正在使用express (最新)和以下代码: POST重定向到GET,但PUT重定向到PUT。是否可以将PUT重定向到GET(与POST相同)? 问题答案: 在详细讨论之前,下面是解决问题的一种方法: 默认情况下,Express使用HTTP代码302进行重定向。根据HTTP规范,这可以防止POST / PUT请求被重定向为POST / PUT请求,并解释了您在代码中观察到的内容: 如

  • 问题内容: 我正在使用postgreSQL。我有一列: 但是,当我想插入带有空字符串的行时,如下所示: 它不会给我错误并接受。如何检查插入值应为?(既不为空也不为空) PS: 我的专栏定义为: 问题答案: 向列定义添加约束。例如类似: 有关更多信息,请参见http://www.postgresql.org/docs/current/static/ddl- constraints.html

  • 我想提出我的问题的一种方式是:如果我使用put来进行一个非幂等调用,然后使用POST来这样做,会有什么问题呢?