FileStore

![Build](https://github.com/rzane/file_store/workflows/Build/badge.svg) ![Version](https://img.shields.io/hexpm/v/file_store) ![Coverage](https://img.shields.io/coveralls/github/rzane/file_store) ![License](https://img.shields.io/hexpm/l/file_store)

FileStore allows you to read, write, upload, download, and interact with files, regardless of where they are stored.

It includes adapters for the following storage backends:

View the documentation

Installation

The package can be installed by adding file_store to your list of dependencies in mix.exs:

def deps do
  [{:file_store, "~> 0.1.0"}]
end

Usage

Configure a new store:

iex> store = FileStore.new(
...>   adapter: FileStore.Adapters.Disk,
...>   storage_path: "/path/to/store/files",
...>   base_url: "http://example.com/files/"
...> )
%FileStore{...}

Write a file to the store:

iex> FileStore.write(store, "foo", "hello world")
:ok

Read a file from the store:

iex> FileStore.read(store, "foo")
{:ok, "hello world"}

Get information about a file in the store:

iex> FileStore.stat("foo")
{:ok, %FileStore.Stat{key: "foo", ...}}

Upload a file to the store:

iex> FileStore.upload(store, "/path/to/upload.txt", "bar")
:ok

Download a file in the store to disk:

iex> FileStore.download(store, "bar", "/path/to/download.txt")
:ok

Get a URL for the file:

iex> FileStore.get_public_url(store, "bar")
"http://example.com/files/bar"

Get a signed URL for the file:

iex> FileStore.get_signed_url(store, "bar")
{:ok, "http://..."}

List all files:

iex> Enum.to_list(FileStore.list!(store))
["bar"]

Delete a file:

iex> FileStore.delete(store, "bar")
:ok

Creating a store

You can also create a dedicated store in your application.

defmodule MyApp.Storage do
  use FileStore.Config, otp_app: :my_app
end

You’ll need to provide configuration for this module:

config :my_app, MyApp.Storage,
  adapter: FileStore.Adapters.Null

Now, you can interact with your store more conveniently:

iex> MyApp.Storage.write("foo", "hello world")
:ok

iex> MyApp.Storage.read("foo")
{:ok, "hello world"}