除了OTP库中的 httpc (通常被认为是 buggy 和笨拙的)之外,还有至少两个用于Erlang的HTTP客户端库: ibrowse lhttpc 。是否有与 ftp 类似的替代方法?

最佳答案

我意识到这是一个古老的问题,但是希望其他人会发现这个问题有用:

lftpc是仿照我们过去6个月左右在生产中使用的lhttpcdlhttpc的“轻量级Erlang FTP客户端”。

现在还没有很好的文档记录,但是这是一个使用 test.rebex.net 的示例:

1> lftpc:start().
ok
2> {ok, {_, _, Socket}} = lftpc:connect("test.rebex.net", 21, []).
{ok,{undefined,{220,[<<"FTP on test.rebex.net ready...">>]},
               <0.65.0>}}
3> lftpc:login(Socket, [{username, <<"demo">>}, {password, <<"password">>}], infinity, []).
{ok,[{undefined,{331,[<<"Password required for demo.">>]},
                undefined},
     {undefined,{230,[<<"User demo logged in.">>]},undefined}]}
4> lftpc:cd(Socket, <<"pub">>, infinity, []).
{ok,{undefined,{250,
                [<<"CWD command successful. \"/pub\" is current directory.">>]},
               undefined}}

默认情况下,没有用于控制或数据连接的解码器。因此,当我们列出包含2个文件的目录:exampletest时,我们得到了:
5> lftpc:nlist(Socket, infinity, []).
{ok,{{150,
      [<<"Data connection accepted from 173.198.175.141:53504; transfer starting.">>]},
     {226,[<<"Transfer ok.">>]},
     [<<"example\r\ntest\r\n">>]}}

我们可以指定一个data_decoder:
6> lftpc:nlist(Socket, infinity, [{partial_download, []}, {data_decoder, lftpc_format:nlst_decoder()}]).
{ok,{{150,
      [<<"Data connection accepted from 127.0.0.1:54359; transfer starting.">>]},
     {226,[<<"Transfer ok.">>]},
     [[<<"example">>,<<"test">>]]}}

我们还可以指定partial_download接收大块数据:
7> {ok, {_, Download}} = lftpc:nlist(Socket, infinity, [{partial_download, []}, {data_decoder, lftpc_format:nlst_decoder()}]).
{ok,{{150,
      [<<"Data connection accepted from 127.0.0.1:54403; transfer starting.">>]},
     <0.86.0>}}
8> receive {data_part, Download, Data} -> Data end.
[<<"example">>,<<"test">>]
9> receive {ftp_eod, Download, Message} -> Message end.
{226,[<<"Transfer ok.">>]}

看一下主要的 src/lftpc.erl 文件,其中有high-levellow-level函数,具体取决于您的需求。您始终可以下拉至lftpc:request/3,4,5,6lftpc:start_transfer/3来执行任何自定义操作。

关于ftp - Erlang的替代FTP客户端库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5497480/

10-10 17:20