Hi,
I’ve seen a couple of examples using the Erlang FTP client from Elixir and I have succesfully stepped through an example but now I’m stuck.
I keep getting an {:error, :epath} error although the file is there.
ftp_target_directory = ftp_target_directory |> String.to_charlist
ftp_host = Config.get(:importer, :ftp_host) |> String.to_charlist
ftp_user = Config.get(:importer, :ftp_user) |> String.to_charlist
ftp_pass = Config.get(:importer, :ftp_pass) |> String.to_charlist
Logger.info("Downloading files from #{inspect ftp_host} to #{inspect ftp_target_directory}")
:application.start :inets
{:ok, pid} = :inets.start(:ftpc, host: ftp_host)
:ftp.user(pid, ftp_user, ftp_pass)
:ftp.pwd(pid)
:ftp.lcd(pid, ftp_target_directory)
:ftp.type(pid, :binary)
directory_list = get_listing(pid)
Enum.each(directory_list, fn directory ->
:ftp.cd(pid, directory)
files = get_listing(pid)
Enum.each(files, fn file ->
Logger.info("Downloading #{inspect file}")
status = :ftp.recv(pid, file)
Logger.info("Status #{inspect status}")
end)
:ftp.cd(pid, '..')
end)
end
defp get_listing(pid) do
{:ok, listing} = :ftp.nlist(pid)
listing = listing |> String.Chars.List.to_string |> String.split("\r\n", trim: true)
Enum.map(listing, fn item -> String.to_char_list(item) end)
end
I’ve put the client in verbose mode but I can’t see the client actually requesting the file, all I get is the error above.
I’m using the bitwalker/alpine-erlang:6.1 with elixir 1.4.
iex(testdownload@127.0.0.1)6> {:ok, pid} = :inets.start(:ftpc, host: ftp_host, verbose: true)
\n220 Welcome to the FTP Service."er (v. 7.2.0)
{:ok, #PID<0.647.0>}
iex(testdownload@127.0.0.1)7> :ftp.user(pid, ftp_user, ftp_pass)
“Sending: USER secret”
“Receiving: 331 Password required for secret”
“Sending: PASS secretpass”
“Receiving: 230 Logon OK. Proceed.”
:ok
iex(testdownload@127.0.0.1)8> :ftp.pwd(pid)
“Sending: PWD”
“Receiving: 257 “/” is current directory.”
{:ok, ‘/’}
iex(testdownload@127.0.0.1)9> :ftp.lcd(pid, ftp_target_directory)
:ok
iex(testdownload@127.0.0.1)10> :ftp.type(pid, :binary)
“Sending: TYPE I”
“Receiving: 200 Type set to I”
:ok
iex(testdownload@127.0.0.1)11> :ftp.cd(pid, ‘files’)
“Sending: CWD files”
“Receiving: 250 CWD command successful.”
:ok
iex(testdownload@127.0.0.1)14> :ftp.nlist(pid)
“Sending: PASV”
“Receiving: 227 Entering Passive Mode (147,14,4,15,156,195)”
“Sending: NLST”
“Receiving: 150 Opening data connection for file list.”
“Receiving: 226 Transfer complete.”
{:ok, ‘file.csv\r\n’}
iex(testdownload@127.0.0.1)12> :ftp.recv(pid, ‘file.csv’)
{:error, :epath}
Can anyone tell me what I’m doing wrong?