ExFTP.Storage.FileConnector (ExFTP v1.0.4)

View Source

When storage_connector is ExFTP.Storage.FileConnector, this connector will use the file system of where it is running.

This is the out-of-the-box behavior you'd expect from any FTP server.

๐Ÿ”’ Security

Currently, there is no file access management per user.

Authenticated users perform file system actions as if they were the FTP user

โš™๏ธ Configuration

Keys

Example

  %{
    # ... ,
    storage_connector: ExFTP.Storage.FileConnector,
    storage_config: %{}
  }

๐Ÿ‘€ See Also

๐Ÿ“– Resources

Summary

Functions

Create a function/1 that writes a stream to storage

Deletes a given directory

Deletes a given file

Whether a given path is an existing directory

Returns a stream to read the raw bytes of an object specified by a given path

Returns a list of ExFTP.StorageConnector.content_info/0 representing each object in a given directory

Returns the current working directory

Creates a directory, given a path

Functions

create_write_func(path, connector_state, opts \\ [])

@spec create_write_func(
  path :: ExFTP.StorageConnector.path(),
  connector_state :: ExFTP.StorageConnector.connector_state(),
  opts :: list()
) :: function()

Create a function/1 that writes a stream to storage

๐Ÿท๏ธ Params

๐Ÿ’ป Examples

    @impl StorageConnector
    def create_write_func(path, connector_state, opts \ []) do
      fn stream ->
        fs = File.stream!(path)

        try do
          _ =
            stream
            |> chunk_stream(opts)
            |> Enum.into(fs)

          {:ok, connector_state}
        rescue
          _ ->
            {:error, "Failed to transfer"}
        end
      end
    end

delete_directory(path, connector_state)

@spec delete_directory(
  path :: ExFTP.StorageConnector.path(),
  connector_state :: ExFTP.StorageConnector.connector_state()
) :: {:ok, ExFTP.StorageConnector.connector_state()} | {:error, term()}

Deletes a given directory

๐Ÿท๏ธ Params

โคต๏ธ Returns

โœ… On Success

  {:ok, connector_state}

โŒ On Failure

  {:error, err}

๐Ÿ’ป Examples

iex> alias ExFTP.Storage.FileConnector
iex> connector_state = %{current_working_directory: "/"}
iex> dir_to_make = File.cwd!() |> Path.join("new_dir")
iex> {:ok, connector_state} = FileConnector.make_directory(dir_to_make, connector_state)
iex> dir_to_rm = dir_to_make
iex> {:ok, connector_state} = FileConnector.delete_directory(dir_to_rm, connector_state)
iex> FileConnector.directory_exists?(dir_to_rm, connector_state)
false

๐Ÿ‘€ See Also

๐Ÿ“– Resources

delete_file(path, connector_state)

@spec delete_file(
  path :: ExFTP.StorageConnector.path(),
  connector_state :: ExFTP.StorageConnector.connector_state()
) :: {:ok, ExFTP.StorageConnector.connector_state()} | {:error, term()}

Deletes a given file

๐Ÿท๏ธ Params

โคต๏ธ Returns

โœ… On Success

  {:ok, connector_state}

โŒ On Failure

  {:error, err}

๐Ÿ‘€ See Also

๐Ÿ“– Resources

directory_exists?(path, connector_state)

@spec directory_exists?(
  path :: ExFTP.StorageConnector.path(),
  connector_state :: ExFTP.StorageConnector.connector_state()
) :: boolean()

Whether a given path is an existing directory

๐Ÿท๏ธ Params

โคต๏ธ Returns

โœ… On Success

  `true` or `false`

๐Ÿ’ป Examples

iex> alias ExFTP.Storage.FileConnector
iex> FileConnector.directory_exists?("/tmp", %{current_working_directory: "/"})
true
iex> FileConnector.directory_exists?("/does-not-exist", %{current_working_directory: "/"})
false

๐Ÿ‘€ See Also

๐Ÿ“– Resources

get_content(path, connector_state)

@spec get_content(
  path :: ExFTP.StorageConnector.path(),
  connector_state :: ExFTP.StorageConnector.connector_state()
) :: {:ok, any()} | {:error, term()}

Returns a stream to read the raw bytes of an object specified by a given path

๐Ÿท๏ธ Params

โคต๏ธ Returns

โœ… On Success

  {:ok, data}

โŒ On Failure

  {:error, err}

๐Ÿ’ป Examples

iex> alias ExFTP.Storage.FileConnector
iex> connector_state = %{current_working_directory: "/"}
iex> file_to_get_content = File.cwd!() |> File.ls!() |> Enum.filter(&String.contains?(&1,".")) |> hd()
iex> path = Path.join(File.cwd!(), file_to_get_content)
iex> {:ok, _data} = FileConnector.get_content(path, connector_state)

๐Ÿ‘€ See Also

๐Ÿ“– Resources

get_content_info(path, connector_state)

@spec get_content_info(
  path :: ExFTP.StorageConnector.path(),
  connector_state :: ExFTP.StorageConnector.connector_state()
) :: {:ok, ExFTP.StorageConnector.content_info()} | {:error, term()}

Returns a ExFTP.StorageConnector.content_info/0 representing a given path

๐Ÿท๏ธ Params

โคต๏ธ Returns

โœ… On Success

  {:ok, %{...}}

โŒ On Failure

  {:error, err}

๐Ÿ’ป Examples

iex> alias ExFTP.Storage.FileConnector
iex> connector_state = %{current_working_directory: "/"}
iex> file_to_get_info = File.cwd!() |> File.ls!() |> hd()
iex> path = Path.join(File.cwd!(), file_to_get_info)
iex> {:ok, _content_info} = FileConnector.get_content_info(path, connector_state)

๐Ÿ‘€ See Also

๐Ÿ“– Resources

get_directory_contents(path, connector_state)

@spec get_directory_contents(
  path :: ExFTP.StorageConnector.path(),
  connector_state :: ExFTP.StorageConnector.connector_state()
) :: {:ok, [ExFTP.StorageConnector.content_info()]} | {:error, term()}

Returns a list of ExFTP.StorageConnector.content_info/0 representing each object in a given directory

๐Ÿท๏ธ Params

โคต๏ธ Returns

โœ… On Success

  {:ok, [%{...}, ...]}

โŒ On Failure

  {:error, err}

๐Ÿ’ป Examples

iex> alias ExFTP.Storage.FileConnector
iex> connector_state = %{current_working_directory: "/"}
iex> dir = File.cwd!()
iex> {:ok, _content_infos} = FileConnector.get_directory_contents(dir, connector_state)

๐Ÿ‘€ See Also

๐Ÿ“– Resources

get_working_directory(connector_state)

@spec get_working_directory(
  connector_state :: ExFTP.StorageConnector.connector_state()
) :: String.t()

Returns the current working directory

๐Ÿท๏ธ Params

๐Ÿ’ป Examples

iex> alias ExFTP.Storage.FileConnector
iex> FileConnector.get_working_directory(%{current_working_directory: "/"})
"/"

๐Ÿ‘€ See Also

๐Ÿ“– Resources

make_directory(path, connector_state)

@spec make_directory(
  path :: ExFTP.StorageConnector.path(),
  connector_state :: ExFTP.StorageConnector.connector_state()
) :: {:ok, ExFTP.StorageConnector.connector_state()} | {:error, term()}

Creates a directory, given a path

๐Ÿท๏ธ Params

โคต๏ธ Returns

โœ… On Success

  {:ok, connector_state}

โŒ On Failure

  {:error, err}

๐Ÿ’ป Examples

iex> alias ExFTP.Storage.FileConnector
iex> connector_state = %{current_working_directory: "/"}
iex> dir_to_make = File.cwd!() |> Path.join("new_dir")
iex> {:ok, connector_state} = FileConnector.make_directory(dir_to_make, connector_state)
iex> FileConnector.directory_exists?(dir_to_make, connector_state)
true
iex> dir_to_rm = dir_to_make
iex> {:ok, connector_state} = FileConnector.delete_directory(dir_to_rm, connector_state)
iex> FileConnector.directory_exists?(dir_to_rm, connector_state)
false

๐Ÿ‘€ See Also

๐Ÿ“– Resources