Скрепка для загрузки изображений на S3 в Rails.Файлы загружаются с очень низкой скоростью.Обходной путь? - PullRequest
3 голосов
/ 07 сентября 2010

Я работаю над приложением rails, где пользователь будет загружать большое количество изображений.

Моя текущая настройка: использование SWFUpload для загрузки нескольких файлов одновременно с использованием плагина Paperclip с хранилищем S3.После загрузки исходного изображения на S3 Delayed_Job используется для постобработки (миниатюры и т. Д.).

Проблема, с которой я столкнулся, заключается в том, что изображения загружаются с очень низкой скоростью.Я предполагаю, что настройки Paperclip по умолчанию состоят в том, что изображение перейдет от пользователя к -> моему серверу на -> s3.

Я думал, что могу загрузить изображения непосредственно на s3, но яне уверен, как реализовать это с помощью Paperclip и последующей обработки.Я не смог найти никаких плагинов или примеров, связанных с этим.

У кого-нибудь есть предложения?Если нет, можете ли вы указать мне правильное направление?

Заранее спасибо!

Тим

Ответы [ 2 ]

3 голосов
/ 08 сентября 2010

Я сталкивался с этой же проблемой несколько раз. Я решил это, создав две модели: модель Image и модель TempImage, которая наследуется от модели Image. Для этого вам необходимо иметь столбец type в таблице Image. Модель TempImage сохраняет изображение локально, а затем, когда вы обращаетесь к нему напрямую из модели Image и сохраняете его, оно будет следовать тому, что определено в модели Image, являясь Amazon S3.

Пример:

# Will save in the database as a TempImage inside the Image table
temp = TempImage.create(:asset => File.new('some_path', 'r'))

# When you find it again through the Image model, it bypasses the type column
# so next time you save it, it is saved as an Image.
amazon = Image.find(temp.id)
amazon.save!

Вот моя отложенная работа:

class MoveToS3Job < Struct.new(:temp_revision_id)
  def perform
    upload = Image.find(temp_revision_id)
    temp_path = File.expand_path("tmp/uploads/#{upload.asset_file_name}", Rails.root)
    upload.asset = File.new(temp_path, 'r')
    upload.save!

    if File.exists?(temp_path) && !File.directory?(temp_path)
      File.delete(temp_path)
    end
  rescue ActiveRecord::RecordNotFound
    # If the record wasn't found, do some sort of
    # error report, but don't keep it in the queue.
  end
end

Вот модель TempImage:

class TempImage < Image
  has_attached_file :asset, {
    :path => ":rails_root/tmp/uploads/:basename_:updated_at.:extension"
  }
end

Тогда оригинальная Image модель:

class Image < ActiveRecord::Base
  # Validations
  validates :asset, :presence => true

  # Paperclip
  has_attached_file :asset, :styles => {
    :preview => ['100x100#', :png],
    :thumb => ['50x50#', :png]
  },
  :default_style => :thumb,
  :storage => :s3,
  :bucket => 'bucket-name',
  :s3_credentials => File.expand_path('config/s3.yml', Rails.root),
  :path => "photos/:id_partition/:style.:extension"
end

Ваша оригинальная Image модель всегда должна содержать вашу постобработку, как это будет сделано в фоновом режиме.

Вы всегда можете переписать некоторые методы, чтобы сделать его немного чище, но это даст вам лучшее представление о том, как оно работает и что вам нужно сделать, чтобы вы могли заставить его работать так, как вы хотите.

0 голосов
/ 27 мая 2011

Если вы в конечном итоге идете по пути загрузки непосредственно на S3, который выгружает работу с вашего сервера Rails, пожалуйста, ознакомьтесь с моими примерами проектов:

Пример проекта с использованием Rails 3, Flash и FancyUploader на основе MooTools длязагрузить напрямую в S3: https://github.com/iwasrobbed/Rails3-S3-Uploader-FancyUploader

Пример проекта с использованием Rails 3, Flash / Silverlight / GoogleGears / BrowserPlus и Pluquload на основе jQuery для загрузки непосредственно в S3: https://github.com/iwasrobbed/Rails3-S3-Uploader-Plupload

Кстати, вы можете выполнить постобработку с помощью Paperclip, используя что-то вроде этого сообщения в блоге:

http://www.railstoolkit.com/posts/fancyupload-amazon-s3-uploader-with-paperclip

...