Adds support for base64 attachments to ActiveStorage.
In order to get the gem working on your project you just need to add the gem to your project like this:
gem 'active_storage_base64'
Rails Version | ActiveStorageBase64 Version |
---|---|
7.1.x | 3.0.x |
7.0.x | 2.0.x |
6.1.x | 1.2.x |
6.0.x | 1.1.x |
5.2.x | 0.1.x |
The only prerequisite for using this gem is having ActiveStorage properly set up in your project. For more information on how to do this, check Active Storage Overview.
In order to use the gem's functionality, you need to include the ActiveStorageSupport::SupportForBase64
module in your ActiveRecord models.
For example:
class User < ActiveRecord::Base
include ActiveStorageSupport::SupportForBase64
end
Note:
We highly recommend using an alternative class that inherits from ActiveRecord::Base
and includes the module so instead of including the module for each of your classes, you make them inherit from this new class, check below:
class ApplicationRecord < ActiveRecord::Base
include ActiveStorageSupport::SupportForBase64
end
class User < ApplicationRecord
has_one_base64_attached :avatar
end
After you have the module included in your class you'll be able to use the following two helper methods to work with base64 files: When you need a single image attached:
has_one_base64_attached
and when you need multiple files attached:
has_many_base64_attached
These helpers will work just like the has_one_attached
and has_many_attached
helper methods from ActiveStorage.
A working example for this, assuming we have a model User
with an avatar
attached would be:
class User < ActiveRecord::Base
include ActiveStorageSupport::SupportForBase64
has_one_base64_attached :avatar
end
on your controller you could do any of the following:
class UsersController < ApplicationController
def create
user = User.create(user_params)
end
private
def user_params
params.require(:user).permit(avatar: :data, :username, :email)
end
end
class UsersController < ApplicationController
def create
user = User.create(user_params)
user.avatar.attach(data: params[:avatar]) # params[:avatar] => 'data:image/png;base64,[base64 data]'
end
private
def user_params
params.require(:user).permit(:username, :email)
end
end
class UsersController < ApplicationController
def create
user = User.create(user_params)
user.avatar.attach(avatar_params) # avatar_params => { data: 'data:image/png;base64,[base64 data]' }
end
private
def user_params
params.require(:user).permit(:username, :email)
end
def avatar_params
params.require(:avatar).permit(:data)
end
end
class UsersController < ApplicationController
def create
user = User.create(user_params)
user.avatar = { data: params[:avatar] } # params[:avatar] => 'data:image/png;base64,[base64 data]'
user.save
end
private
def user_params
params.require(:user).permit(:username, :email)
end
end
If you are willing to add a specific filename to your attachment, or send in a specific content type for your file, you can use data:
to attach the base64 data and specify your filename:
, content_type:
and/or identify:
hash keys.
Check the following example:
class UsersController < ApplicationController
def create
user = User.create(user_params)
user.avatar.attach(data: params[:avatar], filename: 'your_filename', content_type: 'content/type', identify: 'false') # params[:avatar] => 'data:image/png;base64,[base64 data]'
end
private
def user_params
params.require(:user).permit(:username, :email)
end
end
Or, in case you want to have the avatar attached as soon as the user is created you can do:
class UsersController < ApplicationController
def create
user = User.create(user_params)
end
private
def user_params
params.require(:user).permit(:username, :email, avatar: [:data,
:filename,
:content_type,
:identify])
end
end
To attach base64 data it is required to come in the form of Data URIs . For example:
data:image/png;base64,[base64 data]
Please read our CONTRIBUTING and our CODE_OF_CONDUCT files for details on our code of conduct, and the process for submitting pull requests to us.
Ricardo Cortio
This project is licensed under the MIT License - see the LICENSE file for details
Special thanks to the people who helped with guidance and ensuring code quality in this project: Santiago Bartesaghi, Santiago Vidal and Matias Mansilla.
Active Storage Base64 is maintained by Rootstrap with the help of our contributors.