Waffle is a flexible file upload library for Elixir with straightforward integrations for Amazon S3, Azure Blob Storage, and ImageMagick.
Add the latest stable release to your mix.exs file, along with the
required dependencies for your chosen storage provider:
defp deps do
[
{:waffle, "~> 1.1"},
# If using S3:
{:ex_aws, "~> 2.1.2"},
{:ex_aws_s3, "~> 2.0"},
{:hackney, "~> 1.9"},
{:sweet_xml, "~> 0.6"},
# If using Azure Blob Storage:
{:req, "~> 0.4"},
{:timex, "~> 3.7"}
]
endThen run mix deps.get in your shell to fetch the dependencies.
After installing Waffle, another two things should be done:
- setup a storage provider
- define a definition module
Waffle has three built-in storage providers:
Waffle.Storage.LocalWaffle.Storage.S3Waffle.Storage.Azure
Other available storage providers are supported by the community.
An example for setting up Waffle.Storage.Local:
config :waffle,
storage: Waffle.Storage.Local,
asset_host: "http://static.example.com" # or {:system, "ASSET_HOST"}An example for setting up Waffle.Storage.S3:
config :waffle,
storage: Waffle.Storage.S3,
bucket: "custom_bucket", # or {:system, "AWS_S3_BUCKET"}
asset_host: "http://static.example.com" # or {:system, "ASSET_HOST"}
config :ex_aws,
json_codec: Jason
# any configurations provided by https://github.com/ex-aws/ex_awsAn example for setting up Waffle.Storage.Azure:
config :waffle,
storage: Waffle.Storage.Azure,
storage_account: "mystorageaccount", # or {:system, "AZURE_STORAGE_ACCOUNT"}
container: "uploads", # or {:system, "AZURE_STORAGE_CONTAINER"}
access_key: "your-access-key", # or {:system, "AZURE_ACCESS_KEY"}
public_access: false, # Set to true for public access
expiry_in_minutes: 60 # SAS token expiry for private accessWaffle requires a definition module which contains the relevant functions to store and retrieve files:
- Optional transformations of the uploaded file
- Where to put your files (the storage directory)
- How to name your files
- How to secure your files (private? Or publicly accessible?)
- Default placeholders
This module can be created manually or generated by mix waffle.g
automatically.
As an example, we will generate a definition module for handling avatars:
mix waffle.g avatar
This should generate a file at lib/[APP_NAME]_web/uploaders/avatar.ex.
Check this file for descriptions of configurable options.
- An example for Local storage driver
- An example for S3 storage driver
- An example for Azure Blob Storage driver
Waffle comes with a companion package for use with Ecto. If you
intend to use Waffle with Ecto, it is highly recommended you also
add the
waffle_ecto
dependency. Benefits include:
- Changeset integration
- Versioned urls for cache busting (
.../thumb.png?v=63601457477)
-
Rackspace - arc_rackspace
-
Manta - arc_manta
-
OVH - arc_ovh
-
Google Cloud Storage - waffle_gcs
-
Microsoft Azure Storage - Built-in
Waffle.Storage.Azureor arc_azure -
Aliyun OSS Storage - waffle_aliyun_oss
The basic test suite can be run with without supplying any S3 information:
mix test
In order to test S3 capability, you must have access to an S3/equivalent bucket. For S3 buckets, the bucket must be configured to allow ACLs and it must allow public access.
The following environment variables will be used by the test suite:
For S3 testing:
- WAFFLE_TEST_BUCKET
- WAFFLE_TEST_BUCKET2
- WAFFLE_TEST_S3_KEY
- WAFFLE_TEST_S3_SECRET
- WAFFLE_TEST_REGION
For Azure testing:
- AZURE_STORAGE_ACCOUNT
- AZURE_STORAGE_CONTAINER
- AZURE_ACCESS_KEY
After setting these variables, you can run the full test suite with mix test --include s3:true or mix test --include azure:true.
Great thanks to Sean Stavropoulos (@stavro) for the original awesome work on the library.
This project is forked from Arc from the version v0.11.0.
Copyright 2019 Boris Kuznetsov [email protected]
Copyright 2015 Sean Stavropoulos
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.