Commit 62379c21

mo khan <mo@mokhan.ca>
2014-06-05 03:58:19
upload original file directly to s3 instead of using carrierwave.
1 parent eafa109
Changed files (5)
app
services
application
infrastructure
config
initializers
app/services/application/handlers/process_photo.rb
@@ -1,7 +1,8 @@
 class ProcessPhoto
-  def initialize(photos, exif_parser)
+  def initialize(photos, exif_parser, blob_storage = BlobStorage.new)
     @photos = photos
     @exif_parser = exif_parser
+    @blob_storage = blob_storage
   end
 
   def handles?(event)
@@ -11,11 +12,19 @@ class ProcessPhoto
   def handle(message)
     file = File.open(message[:file_path])
     photo = @photos.find(message[:photo_id])
-    photo.image = file
+    #photo.image = file
     photo.image_processing = nil
     photo.content_type = message[:content_type]
     photo.original_filename = message[:original_filename]
     photo.latitude, photo.longitude = @exif_parser.parse_geolocation_from(file)
+    upload_original(message[:file_path], photo)
     photo.save!
   end
+
+  private
+
+  def upload_original(file, photo)
+    key = "uploads/photo/image/#{photo.id}/#{File.basename(file)}"
+    @blob_storage.upload(key, file)
+  end
 end
app/services/infrastructure/blob_storage.rb
@@ -0,0 +1,23 @@
+class BlobStorage
+  attr_reader :bucket_name
+
+  def initialize(bucket_name = ENV['FOG_DIRECTORY'])
+    @bucket_name = bucket_name
+  end
+
+  def upload(key, file)
+    puts "uploading to #{bucket_name}/#{key}"
+    object = connection.buckets[bucket_name].objects[key]
+    object.write(Pathname.new(file), content_type: content_type_for(file), cache_control: 'public, max-age=315576000')
+  end
+
+  private
+
+  def connection
+    @connection ||= AWS::S3.new
+  end
+
+  def content_type_for(file)
+    ::MIME::Types.type_for(file).first.to_s
+  end
+end
config/initializers/aws.rb
@@ -0,0 +1,6 @@
+AWS.config(
+  access_key_id: ENV['AWS_ACCESS_KEY_ID'], 
+  secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
+  logger: Rails.logger,
+  log_level: :debug,
+)
Gemfile
@@ -34,6 +34,8 @@ gem 'gibbon'
 gem 'twitter'
 gem 'spank'
 gem 'exifr'
+gem 'aws-sdk'
+gem 'mime-types'
 
 group :development do
   gem 'capistrano'
Gemfile.lock
@@ -32,6 +32,9 @@ GEM
     asset_sync (1.0.0)
       activemodel
       fog (>= 1.8.0)
+    aws-sdk (1.42.0)
+      json (~> 1.4)
+      nokogiri (>= 1.4.4)
     bcrypt (3.1.7)
     bcrypt-ruby (3.1.5)
       bcrypt (>= 3.1.3)
@@ -316,6 +319,7 @@ PLATFORMS
 DEPENDENCIES
   acts-as-taggable-on (~> 2.4.1)
   asset_sync (~> 1.0.0)
+  aws-sdk
   better_errors
   binding_of_caller
   bootstrap-sass (~> 2.3.0)
@@ -349,6 +353,7 @@ DEPENDENCIES
   jquery-ui-rails (~> 4.0.0)
   kaminari (~> 0.15.0)
   lol_dba
+  mime-types
   newrelic_rpm
   pg
   poltergeist