A file attachment tool that lets users upload to the cloud
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:
gem install attached
brew install imagemagick brew install lame
Migration:
rails g model video name:string encoding:attached
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: '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' }
Copyright (c) 2010 - 2014 Kevin Sylvestre. See LICENSE for details.