11

CarrierWaveフォルダー構造の再編成を使用して、S3 バケット内でファイルを移動しようとしています。

クラスのすべての画像が というフォルダーにアップロードされている既存の Rails アプリケーションにたどり着きました/uploads。これにより、2 人のユーザーが同じファイル名で異なる画像をアップロードすると、2 番目の画像が最初の画像を上書きするという問題が発生しています。ActiveRecordこれを解決するには、フォルダーを再編成して、オブジェクト インスタンスに従って各画像を独自のディレクトリに配置します。CarrierWaveファイルのアップロードを管理するために使用しています。

古いアップローダ コードには次のメソッドがありました。

def store_dir
  "uploads"
end

新しいファイル ストレージ スキームを反映するようにメソッドを変更しました。

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

これは新しい画像にはうまく機能しますが、古い画像の URL は機能しません。モデルを変更するとすぐに、既存の画像の URL が新しいフォルダー内にあると報告されますが、画像ファイルはまだ に保存されてい/uploadsます。

> object.logo.store_dir
=> "uploads/object/logo/133"

これは正しくありません。このオブジェクトは、そのロゴを で報告する必要があり/uploadsます。

私の解決策は、画像ファイルを移動するスクリプトを作成することですが、CarrierWave でファイルを移動するための正しい方法が見つかりませんでした。私のスクリプトは次のようになります。

MyClass.all.each |image|
  filename = file.name #This method exists in my uploader, returns the file name
  #Move the file from "/uploads" to "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end 

ファイルを新しい場所に移動するには、スクリプトの 3 行目で何をすればよいですか?

4

1 に答える 1

20

警告: これはテストされていないため、テストする前に本番環境で使用しないでください。

「store_dir」の内容を変更すると、古いアップロードがすべて失われます。あなたはすでにこれを知っています。キャリアウェーブには移動機能がないため、S3 と直接対話することが、これを解決する最も明白な方法のように思えます。

うまくいくかもしれないことの1つは、アップロードを再「保存」し、「before :store」コールバックの「store_dir」パスを変更することです。

アップローダーで:

#Use the old uploads directory so carriewave knows where the original upload is
def store_dir
  'uploads'
end

before :store, :swap_out_store_dir

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

そして、次のようなスクリプトを実行します。

MyClass.all.each do |image|
  image.image.cache! #create a local cache so that store! has something to store
  image.image.store!
end

その後、ファイルが正しい場所にコピーされたことを確認します。その後、古いアップロード ファイルを削除する必要があります。また、上記の 1 回限りのアップローダ コードを削除し、新しい store_dir パスに置き換えます。

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

私はこれをテストしていないので、動作することを保証できません。最初にテスト データを使用して動作するかどうかを確認し、成功した場合はここにコメントしてください。

于 2014-01-02T09:01:41.347 に答える