No commit activity in last 3 years
No release in over 3 years
Attached is a Ruby on Rails cloud attachment and processor library inspired by Paperclip. Attached lets users push files to the cloud, then perform remote processing on the files.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

>= 0
> 3.0.0
 Project Readme

Attached¶ ↑

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.

Requirements¶ ↑

The gem is tested with:

  • Ruby on Rails 4.1.6

  • Ruby 2.1.6

  • Ruby 2.0.0

  • Ruby 1.9.3

  • JRuby

Installation¶ ↑

gem install attached

Optional¶ ↑

brew install imagemagick
brew install lame

Examples¶ ↑

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>

Advanced¶ ↑

Validations¶ ↑

# 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)

Storage¶ ↑

# 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"

Processors¶ ↑

# 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' },
}

Strategies¶ ↑

# app/models/sample.rb
has_attached :file, processor: ..., styles: { ... }, strategy: :delay
has_attached :file, processor: ..., styles: { ... }, strategy: :cache

Reprocessing¶ ↑

rake attached:process[Image,file]
rake attached:process[Audio,file]

Aliases¶ ↑

# 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/
)

Metadata¶ ↑

# app/initializers/attached.rb
Attached::Attachment.options[:metadata] = { 'Cache-Control' => 'max-age=3153600' }

Status¶ ↑

<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.