# `Storehouse.Ecto.File`
[🔗](https://github.com/hattoriai/storehouse/blob/v0.2.0/lib/storehouse/ecto/file.ex#L2)

An Ecto type for a stored file (`Storehouse.File`) in a record's column:
a map (`jsonb` in PostgreSQL) of its key, URL, name, type, size,
checksum, width, height, metadata (`Storehouse.Metadata`) and analysis
(`Storehouse.Analysis`, each step's as `Storehouse.Analysis.to_map/1`). No table of files: the record has its file.

    schema "users" do
      field :avatar, Storehouse.Ecto.File
      field :photos, {:array, Storehouse.Ecto.File}, default: []
    end

    # The migration
    add :avatar, :map
    add :photos, {:array, :map}, default: []

It casts a `Storehouse.File` only, never a map of a form's params: a
file's key comes from Storehouse, never from a browser, so that no one
puts another's file in their record. Put files with
`Storehouse.Ecto.put_file/4`.

## A store of the field's own

`store:` names the store the field's files are kept in (a module of
`use Storehouse.S3` or `use Storehouse.Local`): `Storehouse.Ecto` makes
them permanent there, deletes them from there, and analyzes them from
there. The default is `Storehouse.adapter/0`.

    field :invoice, Storehouse.Ecto.File, store: MyApp.PrivateFiles
    field :scans, {:array, Storehouse.Ecto.File}, store: MyApp.PrivateFiles, default: []

# `store`

```elixir
@spec store(map()) :: module() | nil
```

The store of a field's files, as `init/1` keeps it: a module, or `nil`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
