Coder Social home page Coder Social logo

attached's Introduction

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

  • Ruby on Rails 4.0.6

  • Ruby 2.1.2

  • 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: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>

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.

attached's People

Contributors

ksylvest avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.