2

attachment_fu を使用する Rails アプリケーションがあります。現在、ストレージに使用していますが、より多くのファイルがアップロードされるにつれてスケーリングを改善できるよう:file_systemに、に変更したいと考えています。:s3

これには何が関係していますか?コードを use:s3に切り替えるだけで、古いリンクがすべて壊れてしまうと思います。既存のファイルをファイルシステムから S3 にコピーするだけでよいですか? このトピックについては、Google 検索ではあまりヒットしませんでした。

既存のファイルを S3 に移動したいので、すべてが同じ場所にありますが、必要に応じて、新しいファイルが S3 に移動する限り、古いファイルはそのままの場所にとどまることができます。

編集: そのため、ファイルを S3 にコピーするほど単純ではありません。URL は別のスキームを使用して作成されます。に保存する:file_systemと、ファイルは /public/photos/0000/0001/file.name のような場所に保存されますが、同じファイルが:s30/1/file.name に保存される可能性があります。私はそれがid何かを使用していて、それをゼロで埋めている(または埋めていない)だけだと思いますが、それについてはわかりません。

4

4 に答える 4

4

そのとおりです。ID は :file_system ストレージを使用してパディングされます。すべてのファイルの名前を変更する代わりに、s3 バックエンド モジュールを変更して、パディングされた数字を使用することもできます。

partitioned_pathからメソッドをコピーしてfile_system_backend.rbに入れs3_backend.rbます。

    def partitioned_path(*args)
      if respond_to?(:attachment_options) && attachment_options[:partition] == false
        args
      elsif attachment_options[:uuid_primary_key]
        # Primary key is a 128-bit UUID in hex format. Split it into 2 components.
        path_id = attachment_path_id.to_s
        component1 = path_id[0..15] || "-"
        component2 = path_id[16..-1] || "-"
        [component1, component2] + args
      else
        path_id = attachment_path_id
        if path_id.is_a?(Integer)
          # Primary key is an integer. Split it after padding it with 0.
          ("%08d" % path_id).scan(/..../) + args
        else
          # Primary key is a String. Hash it, then split it into 4 components.
          hash = Digest::SHA512.hexdigest(path_id.to_s)
          [hash[0..31], hash[32..63], hash[64..95], hash[96..127]] + args
        end
      end
    end

s3_backend.rbを使用するようにのfull_filenameメソッドを変更しますpartitioned_path

    def full_filename(thumbnail = nil)
      File.join(base_path, *partitioned_path(thumbnail_name_for(thumbnail)))
    end

attachment_fu は、file_system バックエンドで行ったのと同じ名前のパスを作成するようになったため、すべての名前を変更することなく、ファイルを s3 にコピーするだけで済みます。

于 2009-11-03T19:24:59.580 に答える
2

nilbus の回答に加えて、空の文字列を返すようにs3_backend.rbのメソッドを変更する必要がありました。そうしないと、 2 回挿入されます。base_pathattachment_path_id

def base_path
  return ''
end
于 2011-01-21T14:35:47.423 に答える
2

nilbusの答えに加えて、私にとってうまくいったのは、s3_backend.rbのbase_pathメソッドを変更してpath_prefix(デフォルトではテーブル名)を引き続き使用することでした:

def base_path
  attachment_options[:path_prefix]
end

また、attachment_path_idfile_system_backend.rb から取得し、s3_backend.rb のものを置き換える必要がありました。それ以外の場合partitioned_pathは、常に主キーが文字列であると考えていたためです。

def attachment_path_id
  ((respond_to?(:parent_id) && parent_id) || id) || 0
end
于 2011-05-12T21:09:02.123 に答える
0

多くの助けになったすべての回答に感謝します。それは私にとってもうまくいきましたが、:thumbnail_classオプションを機能させるためにこれをしなければなりませんでした:

def full_filename(thumbnail = nil)
  prefix = (thumbnail ? thumbnail_class : self).attachment_options[:path_prefix].to_s
  File.join(prefix, *partitioned_path(thumbnail_name_for(thumbnail)))
end
于 2013-02-19T16:15:01.600 に答える