我意识到这是一个老问题,但希望其他人会发现这很有用:
lftpc是一个“轻量级 Erlang FTP 客户端”,仿照lhttpc和dlhttpc为模型,我们在过去 6 个月左右的时间里一直在生产中使用它们。
目前还没有很好的记录,但这里有一个使用的示例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}}
Run Code Online (Sandbox Code Playgroud)
默认情况下,没有用于控制或数据连接的解码器。因此,当我们列出包含 2 个文件的目录时:example我们test得到:
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">>]}}
Run Code Online (Sandbox Code Playgroud)
我们可以指定一个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">>]]}}
Run Code Online (Sandbox Code Playgroud)
我们还可以指定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.">>]}
Run Code Online (Sandbox Code Playgroud)
看一下主文件,根据您的需要,src/lftpc.erl有高级和低级功能。您可以随时下拉lftpc:request/3,4,5,6并lftpc:start_transfer/3执行任何自定义操作。