3

ユーザーが大量の画像をアップロードするレールアプリに取り組んでいます。

私の現在のセットアップ: S3 ストレージを備えた Paperclip プラグインを使用して、SWFUpload を使用して一度に複数のファイルをアップロードします。元の画像が S3 にアップロードされた後、Delayed_Job は後処理 (サムネイルなど) に使用されます。

私が抱えている問題は、画像のアップロード速度が非常に遅いことです。デフォルトのペーパークリップ設定は、画像がユーザーから->サーバーから-> s3に移動することであると想定しています。

画像をs3に直接アップロードできると思っていましたが、ペーパークリップと後処理でそれを実装する方法がわかりません。これを扱っているプラ​​グインや例は見つかりませんでした。

誰にも提案はありますか?そうでない場合は、正しい方向に私を向けることができますか?

前もって感謝します!

ティム

4

2 に答える 2

3

私はこの同じ問題に数回遭遇しました。私がそれを解決した方法は、ImageモデルとTempImageモデルを継承するモデルの2つのモデルを作成することでしたImage。これには、テーブルにtype列が必要です。モデルは画像をローカルに保存し、モデルから直接アクセスしてImage再保存すると、 Amazon S3であるモデルで定義されているものに従います。TempImageImageImage

例:

# 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モデルには常に後処理が含まれている必要があります。

いつでもいくつかのメソッドを上書きして少しきれいにすることができますが、これにより、それがどのように機能し、何をする必要があるかについてのより良いアイデアが得られるため、希望どおりに機能させることができます.

于 2010-09-07T22:05:17.470 に答える
0

Rails サーバーから作業をオフロードする S3 に直接アップロードするルートにたどり着いた場合は、私のサンプル プロジェクトをチェックしてください。

Rails 3、Flash、および MooTools ベースの FancyUploader を使用して S3 に直接アップロードするサンプル プロジェクト: https://github.com/iwasrobbed/Rails3-S3-Uploader-FancyUploader

Rails 3、Flash/Silverlight/GoogleGears/BrowserPlus、および jQuery ベースの Plupload を使用して S3 に直接アップロードするサンプル プロジェクト: https://github.com/iwasrobbed/Rails3-S3-Uploader-Plupload

ところで、このブログ投稿のようなものを使用して、Paperclip で後処理を行うことができます。

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

于 2011-05-27T16:23:23.863 に答える