Attached is a Ruby on Rails file attachment tool that lets users upload to the cloud. The gem supports AWS, Google and Rackspace for storage networks by default. It is influenced (and copied) from Paperclip and makes heavy use of the incredibly awesome Fog library.
The gem is tested with:
-
Ruby on Rails 4.1.6
-
Ruby 2.1.6
-
Ruby 2.0.0
-
Ruby 1.9.3
-
JRuby
gem install attached
brew install imagemagick brew install lame
Migration:
rails g model video name:string encoding:attachment class CreateVideo < ActiveRecord::Migration def self.up create_table :videos do |t| t.string :name t.attachment :encoding t.timestamps end end def self.down drop_table :videos end end
Model:
class Video < ActiveRecord::Base has_attached :encoding, styles: { webm: { extension: '.webm' }, mp4: { extension: '.mp4' }, ogv: { extension: '.ogv' }, } after_save do remote.encode(self.encoding.url) end end
Form:
<%= form_for @video, html: { multipart: true } do |form| %> <%= form.file_field :encoding %> <% end %>
View:
<video> <source src="<%= @video.encoding.url(:webm)" /> <source src="<%= @video.encoding.url(:mp4) %>" /> <source src="<%= @video.encoding.url(:ogg) %>" /> </video>
# app/models/person.rb validates_attached_presence :file validates_attached_size :file, in: 2.kilobytes..2.megabytes validates_attached_extension :file, in: %w(jpe jpg jpeg png)
# app/models/user.rb has_attached :file, medium: :aws, credentials: "#{Rails.root}/config/aws.yml" # app/models/user.rb has_attached :file, medium: :google, credentials: "#{Rails.root}/config/google.yml" # app/models/user.rb has_attached :file, medium: :rackspace, credentials: "#{Rails.root}/config/rackspace.yml" # config/initializers/attached.rb Attached::Attachment.options[:medium] = :aws Attached::Attachment.options[:credentials] = "#{Rails.root}/config/aws.yml" # config/initializers/attached.rb Attached::Attachment.options[:medium] = :google Attached::Attachment.options[:credentials] = "#{Rails.root}/config/google.yml" # config/initializers/attached.rb Attached::Attachment.options[:medium] = :rackspace Attached::Attachment.options[:credentials] = "#{Rails.root}/config/rackspace.yml"
# app/models/image.rb has_attached :file, processor: :image, styles: { small: { size: '200x200>', extension: '.jpg', quality: 90 }, large: { size: '400x400<', extension: '.jpg', quality: 90 }, default: { size: '300x300#', extension: '.jpg', quality: 90 }, } # app/models/image.rb has_attached :file, processor: :image, styles: { small: { operation: :decrease, width: 200, height: 200, extension: '.jpg', quality: 90 }, large: { operation: :increase, width: 400, height: 400, extension: '.jpg', quality: 90 }, default: { operation: :resize, width: 300, height: 300, extension: '.jpg', quality: 90 }, } # app/models/audio.rb has_attached :file, processor: :audio, styles: { full: { preset: '320kbps', extension: '.wav' }, large: { preset: '256kbps', extension: '.wav' }, small: { preset: '128kbps', extension: '.wav' }, } # app/models/audio.rb has_attached :file, processor: :audio, styles: { full: { preset: 'insane', extension: '.wav' }, large: { preset: 'extreme', extension: '.wav' }, small: { preset: 'medium', extension: '.wav' }, }
# app/models/sample.rb has_attached :file, processor: ..., styles: { ... }, strategy: :delay has_attached :file, processor: ..., styles: { ... }, strategy: :cache
rake attached:process[Image,file] rake attached:process[Audio,file]
# app/initializer/attached.rb Attached::Attachment.options[:alias] = "https://storage.ksylvest.com/" # app/initializer/attached.rb Attached::Attachment.options[:aliases] = %w( https://a.storage.ksylvest.com/ https://b.storage.ksylvest.com/ https://c.storage.ksylvest.com/ https://d.storage.ksylvest.com/ )
# app/initializers/attached.rb Attached::Attachment.options[:metadata] = { 'Cache-Control' => 'max-age=3153600' }
<img src=“https://img.shields.io/gemnasium/ksylvest/attached.svg” /> <img src=“https://img.shields.io/travis/ksylvest/attached.svg” /> <img src=“https://img.shields.io/coveralls/ksylvest/attached.svg” /> <img src=“https://img.shields.io/codeclimate/github/ksylvest/attached.svg” />
Copyright © 2010 - 2014 Kevin Sylvestre. See LICENSE for details.