Image processing
Architecture overview
In a typical Solidus store, you can upload images for products and taxons.
Under the hood, Solidus will use a different file processing library depending on the Rails version: Active Storage is the default starting from Rails 6.1, while Paperclip is used in earlier versions.
Active Storage cannot be used in Rails 6.0 or earlier because it doesn't support public URLs, which Solidus needs to serve images to your users. If you're on Rails 6.0 or earlier, you have to use Paperclip.
While Paperclip is deprecated and will be removed in the near future, Solidus provides a compatibility layer that abstracts the differences between the two libraries, in order to offer an easier migration path to existing Paperclip users.
Customizing image sizes
By default, Solidus uses the following sizes for product images:
mini
: 48x48small
: 400x400product
: 680x680large
: 1200x1200
and the following sizes for taxon icons:
mini
: 32x32normal
: 128x128
You can access the URL for a specific size by calling Spree::Image#url
:
image = Spree::Product.first.gallery.images.first
image.url(:product)
If you're building a custom storefront, you may also want to change the sizes of
the images in your store or add additional sizes. The default sizes can be changed
using the Spree::Config.product_image_styles
option.
For example, we can set some new defaults and introduce a new :jumbo
style
like this:
Spree.config do |config|
# ...
config.product_image_styles = {
mini: '48x48>',
small: '100x100>',
product: '240x240>',
large: '600x600>',
jumbo: '1600x1600>'
}
end
Similar to product styles, you can customize the taxon image styles using the
Spree::Config.taxon_image_styles
configuration option.
Active Storage will automatically generate sizes upon initial request. If you change the default image sizes and are using Paperclip, you must regenerate the styles by running a Rake task:
bundle exec rake paperclip:refresh:thumbnails CLASS=Spree::Image
or if you are only adding new styles, you can run the following task:
bundle exec rake paperclip:refresh:missing_styles CLASS=Spree::Image
Now that you changed your sizes, try getting the URL for your new jumbo
or mini
sizes:
image = Spree::Product.first.gallery.images.first
image.url(:jumbo)
icon = Spree::Taxon.first.icon
icon.url(:mini)
You can also use your new styles in the image
partial in the backend:
<%= render 'spree/admin/shared/image', image: product.gallery.images.first, size: :jumbo %>
and if you are using solidus_starter_frontend
for your storefront like this:
<%= render(
ImageComponent.new(
image: product.gallery.images.first,
size: :jumbo,
itemprop: "image",
data: { js: 'product-main-image' }
)
) %>
Customizing the allowed MIME types
By default, Solidus only accepts PNG, JPEG and GIF images. If you want to accept additional MIME
types, e.g. WebP, you can do it via the allowed_image_mime_types
configuration option:
Spree.config do |config|
# ...
config.allowed_image_mime_types = %w(image/jpeg image/jpg image/png image/gif image/webp).freeze
end
Replacing an attachment module
If the change you want to apply cannot be made through the existing configuration options, you can entirely replace the product image or taxon icon attachment module with your own.
This can be useful, for example, if you need to customize your image styles or perform custom post-processing operations on your image such as watermarking, compression, etc.
Here's an example for the product image attachment:
module AmazingStore
module ImageAttachment
# ...
end
end
Once you have your custom attachment module, you need to tell Solidus to use it:
Spree.config do |config|
# ...
config.image_attachment_module = 'AmazingStore::ImageAttachment'
end
To replace the taxon attachment, follow the same process, but set the taxon_attachment_module
configuration option instead.