Skip to content

ksylvest/attached

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
lib
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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.

About

A file attachment tool that lets users upload to the cloud

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages