3

私はこのサイトを検索してきましたが、画像やファイルをアップロードするためのフォルダ/ファイルを構造化するための最良の方法を見つけることができないようです。以下を使用してRubyonRailsWebサイトをデプロイしています。

  • CarrierWave(アップロード)
  • Capistrano(展開)
  • Amazon S3(ストレージ)
  • Capistrano(展開)

このサイトでは、ユーザーが画像をアップロードするプロファイルを設定できます。複数の画像をアップロードする数千人(または数万人)のユーザーに対応できるフォルダー構造を使用したいと思います。

現在、デフォルトのCarrierWaveディレクトリ構造を使用しています。

def store_dir
  "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

しかし、フォルダ名にuser_idを含める方が良いと思いますか?このフォルダをフォルダの外に移動する方が良いpublic/uploadsですか?開発環境、本番環境、テスト環境で異なるフォルダーを使用するべきではありませんか?何千人ものユーザーがプロファイルごとに約15個のファイルをアップロードしているサイト(フルサイズ、プロファイル、サムネイルサイズとして保存)に最適な方法でstore_dirをオーバーライドしたいと思います。

4

1 に答える 1

8

通常のフォルダ構造は帽子を非常によくサポートする必要があります。主なことは、衝突を回避し、サイト全体の画像に使用する関連付けが一貫していることを確認することです。これらの理由から、すべての画像を1つのフォルダに保存するだけでは不十分です。

しかし、フォルダ名にuser_idを含める方が良いと思いますか?

私はこれをお勧めしません、それはその価値より多くの問題を引き起こすかもしれません。モデルクラスとIDを使用するだけで十分です。また、アップローダーではないユーザーが画像を表示しようとした場合など、アップローダーで画像のマッピングに問題が発生する可能性があります。

このフォルダーをpublic/uploadsフォルダーの外に移動する方がよいですか?

Amazon S3を使用しているため、参照している場所である場合、画像は実際にはプロジェクトのパブリック/アップロードに保存されません。これは、Carrierwaveがファイルのアップロード/サイズ変更中に使用する一時ファイルのみである必要があります。スペース/セキュリティが心配な場合は、これを確認し、必要に応じてニーズに合わせて調整することをお勧めします。

開発環境、本番環境、テスト環境で異なるフォルダーを使用するべきではありませんか?

必要に応じて、さまざまなフォルダを使用できます。

def store_dir
  "#{Rails.env}/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

または、Amazon S3で別のバケットを使用します(推奨):

config/initializers/fog.rbのようなもので:

CarrierWave.configure do |config|
  config.storage = :fog
  config.fog_credentials = {
    :provider              => <provider>,
    :aws_access_key_id     => <id>,
    :aws_secret_access_key => <key>
  }
  if Rails.env == "production"
    config.fog_directory = 'production'
  elsif Rails.env == "development"
    config.fog_directory = 'development'
  elsif ...
    config.fog_directory = '...'
  end
end

または、別の環境ファイルで同様のことを行うこともできます。

何千人ものユーザーがプロファイルごとに約15個のファイルをアップロードしているサイト(フルサイズ、プロファイル、サムネイルサイズとして保存)に最適な方法でstore_dirをオーバーライドしたいと思います。

このストレージディレクトリ構造は、サイズ変更に関する限り、ガイドを確認する必要がありますが、問題なく機能するはずです。

アップデート:

ファイル名については、フォルダ自体の中で名前が衝突する可能性を回避できるように、ランダムな文字列に変更することを強くお勧めします。誰かがme.jpg2つの異なるファイルをアップロードする可能性はほとんどありません。そうは言っても、これが私のやり方です。

以内にyour_uploader.rb

現在のファイル名をランダム化するfilenameメソッドを追加します。

 def filename
   random_token = Digest::SHA2.hexdigest("#{Time.now.utc}--#{model.id.to_s}").first(20)
   ivar = "@#{mounted_as}_secure_token"
   token = model.instance_variable_get(ivar)
   token ||= model.instance_variable_set(ivar, random_token)
   "#{token}.jpg" if original_filename
  end

この特定の取り決めは少しやり過ぎかもしれませんが、それは私にとって十分であることがわかります。

お役に立てれば!

于 2012-12-31T21:05:24.170 に答える