次のファイル名の構造でアップロードされた何千もの画像があります。carrierwave recreate_versionは元の保存されたファイル名とは異なるファイル名でサムを作成します
def filename
"#{model.id}" + "-v#{timestamp}" + "-" + Category.find("#{model.category_id}").slug + "-" + CategoryItem.find("#{model.category_item_id}").slug + ".png" if original_filename.present?
end
def timestamp
var = :"@#{mounted_as}_timestamp"
model.instance_variable_get(var) or model.instance_variable_set(var, Time.now.to_i)
end
特定のページの読み込み時間を短縮するために、すべての画像のサムを作成する必要があります。私が実行したとき、私は今、アップローダファイルでセットアップ親指のバージョンを
# Create different versions of your uploaded files:
version :thumb do
process :resize_to_limit => [110, nil]
end
けどをしました:CategoryItem.each {|item| item.image_value.recreate_versions! if item.image_value? }
は親指が作成されますが、親指の画像のファイル名は、元のファイルと同じではありませんファイル名の先頭に追加された「thumb_」を超えています。
saved filename: 1-v1474175808-shoes-runners.png
thumb filename: thumb_1-v1472111618-shoes-runners.png (different timestamp)
CategoryItem.find(1).image_value_url(:thumb): thumb_1-v1474175808-shoes-runners.png (original filename timestamp)
したがって、image_tag CategoryItem.find(1).image_value_url(:thumb)
を呼び出すと、存在しないファイルが検索されます。
recreate_versions
を実行して、サムファイル名を元の保存ファイル名と同じにすることはできますが、タイムスタンプを削除せずに「thumb_」を先頭に追加しますか?
更新:
私は今、私の問題は、私は、直接ファイル名File.basename(model.image_value.path).to_s
、私はrecreate_versions
を実行すると、それはまだセーブを呼んでいるにもかかわらず、ということである。このhttps://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Customize-your-version-file-names
version :thumb do
process :resize_to_limit => [110, nil]
def full_filename(for_file = model.image_value.file)
'thumb_' + File.basename(model.image_value.path).to_s
end
end
を見つけることから、次のを持っています元のファイル名を取得するのではなく、現在のタイムスタンプを持つファイルDB内のファイル名が変更されていて、新しいファイル名を取得していると思っていたのですが、期待どおりの状態を保っていると思いますので、DBから直接値を取得するのはなぜか分かりません。多分def full_filename(for_file = model.image_value.file)
ありえないが、作業が、私は
version :thumb do
process :resize_to_limit => [110, nil]
def full_filename(for_file = model.image_value.file)
'thumb_' + "random-text"
end
end
に変更した場合、
元の画像のファイル名ではなく、現在のタイムスタンプで保存されます。私は 'thumb_' + model.image_value.to_s'を疲れましたが、URL全体を使用します – Rob
ファイル名にタイムスタンプを含める理由を明確にすることはできますか? –
timestampメソッドは、carrierwaveドキュメントから直接取得します。私はhttp://stackoverflow.com/questions/5132847/displaying-a-carrierwave-filename-in-the-viewを読んで「thumb_」+ File.basename(model.image_value.path).to_s'を追加しました。 'File.basename(model.image_value.path).to_s'はdbに保存された正確なファイル名を取得しますが、ファイル名の現在のタイムスタンプを保存し、dbからファイル名を直接コピーしません。 – Rob