2013-02-15 29 views
8

ile Carrierwave kullanarak sürümleri yeniden oluşturma Üzerinde çalıştığım web sitesi bir yeniden tasarımdan geçiyor ve bu nedenle, kullanıcı resimlerimizin yeniden boyutlandırılması gerekiyor. web sitesi şu anda tüm görüntü ve video işleme ele carrierwave mücevher kullanıyor ve her resim aşağıdaki dayalı benzersiz bir dosya adı taşıyan bir özgün dosyası vardır:Ruby ile

def filename 
    if original_filename 
    if model && model.read_attribute(:user_image).present? 
     model.read_attribute(:user_image) 
    else 
     @name ||= "#{secure_token}.#{file.extension}" if original_filename.present? 
    end 
    end 
end 

ve

def secure_token 
    var = :"@#{mounted_as}_secure_token" 
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid) 
end 
tarafından üretilebilir secure_token

bunu yapmak için oluşturulan bir görevdir:

yeni görüntüler oluşturur iken sorun, dosyalar yerine yeni bir dosya adı altında kaydedilen olduğunu
## 
# CarrierWave Amazon S3 File Reprocessor Rake Task 
# 
# Written (specifically) for: 
# - CarrierWave 
# - Ruby on Rails 3 
# - Amazon S3 
# 
# Works with: 
# - Any server of which you have write-permissions in the Rails.root/tmp directory 
# - Works with Heroku 
# 
# Not tested with, but might work with: 
# - Ruby on Rails 2 
# 
# Might work with, after a couple of tweaks: 
# - File System Storage 
# - Cloud Files Storage 
# - GridFS 
# 
# Examples: 
# 
# Reprocess all versions of User#avatar 
# rake carrierwave:reprocess class=User mounted_uploader=avatar 
# 
# Reprocess the versions: thumb, small, medium for User#avatar 
# rake carrierwave:reprocess class=User mounted_uploader=avatar versions='thumb, small, medium' 
# 
# Reprocess for an underlying association, for things like Embedded MongoDB Documents 
# which are models you cannot access directly, but rather through a regular Document 
# 
# Embeds One (picture) Association 
# rake carrierwave:reprocess class=User association=picture mounted_uploader=image versions='thumb, small, medium' 
# 
# Embeds Many (pictures) Association 
# rake carrierwave:reprocess class=User association=pictures mounted_uploader=image versions='thumb, small, medium' 
# 
# WARNING 
# There is an issue with "Rake", that you cannot name your mounted_uploader "file". 
# If you do this, then you will not be able to reprocess images through this rake task 
# class User 
# include Mongoid::Document 
# mount_uploader :file, PictureUploader 
# end 
# 
# This will NOT work with reprocessing through Rake because the mounted_uploader uses the "file" attribute. 

namespace :carrierwave do 

    ## 
    # Only tested with Amazon S3 Storage 
    # Needs some minor modifications if you want to use this for File System Store, Cloud Files and GridFS probably. 
    # This should work without Ruby on Rails as well, just set a different TMP_PATH. 
    desc "Reprocesses Carrier Wave file versions of a given model." 
    task :reprocess => :environment do 

    ## 
    # Load in the OPEN URI library to be able 
    # to pull down and store the original file in a temp directory 
    require 'open-uri' 

    ## 
    # Default constants 
    TMP_PATH   = "#{Rails.root}/tmp/carrierwave" 

    ## 
    # Set environment constants 
    CLASS    = ENV['class'].capitalize 
    ASSOCIATION  = ENV['association'] || nil 
    MOUNTED_UPLOADER = ENV['mounted_uploader'].to_sym 
    VERSIONS   = ENV['versions'].nil? ? Array.new : ENV['versions'].split(',').map {|version| version.strip.to_sym} 

    ## 
    # Find the Model 
    MODEL = Kernel.const_get(CLASS) 

    ## 
    # Create the temp directory 
    %x(mkdir -p "#{TMP_PATH}") 

    ## 
    # Find all records for the provided Model 
    records = MODEL.all 

    ## 
    # Output to console 
    puts "\nCarrier Wave Version Reprocessing!" 
    puts "=======================================" 
    puts "Model:    #{CLASS}" 
    puts "Mounted Uploader: #{MOUNTED_UPLOADER}" 
    puts "Association:  #{ASSOCIATION}" if ASSOCIATION 
    puts "Versions:   #{VERSIONS.empty? ? "all" : VERSIONS.join(', ')}\n\n" 

    ## 
    # Run through all records 
    records.each do |record| 

     ## 
     # Set the mounted uploader object 
     # If it has a one-to-one association (singular) then that object 
     # will be returned and wrapped in an array so we can "iterate" through it below. 
     # 
     # If it has a one-to-many association then it will return the array of associated objects 
     # 
     # If no association is specified, it assumes the amounted uploader is attached to the specified CLASS 
     if ASSOCIATION 
     if ASSOCIATION.singular? 
      objects = [record.send(ASSOCIATION)] 
     else 
      objects = record.send(ASSOCIATION)   
     end 
     else 
     objects = [record] 
     end 

     ## 
     # Iterates through the objects 
     objects.each do |object| 

     ## 
     # Returns the mounted uploader object 
     mounted_object = object.send(MOUNTED_UPLOADER) 

     ## 
     # Retrieve Filename 
     filename = mounted_object.path.split('/').last 

     ## 
     # Output to console 
     puts "Reprocessing: #{filename}" 

     ## 
     # Read out the original file from the remote location 
     # and write it out to the temp directory (TMP_PATH) 
     # This file will be used as the base file to reprocess 
     # the versions. Once all versions have been processed, 
     # this temp file will be directly removed. 
     open(mounted_object.url) do |original_object| 
      File.open(File.join(TMP_PATH, filename), 'w') do |temp_file| 
      temp_file.write(original_object.read) 
      end 
     end 

     ## 
     # By default it will add all available versions to the versions variable 
     # which means that all available versions will be reprocessed. 
     # If the "versions" argument has been provided, then only the specified 
     # version(s) will be set to the versions variable, and thus, only these 
     # will be reprocessed. 
     versions = mounted_object.versions.map {|version| version[0]} 
     versions = VERSIONS unless VERSIONS.empty? 

     ## 
     # Reprocesses the versions 
     versions.each do |version| 
      mounted_object.send(version).cache!(File.open(File.join(TMP_PATH, filename))) 
      mounted_object.send(version).store! 
     end 

     ## 
     # Removes the temp file 
     %x(rm "#{TMP_PATH}/#{filename}") 
     end 
    end 
    end 
end 

resim yükleyicide belirtilen adlandırma sonrasında, web sitesi onları bulamıyor. Aşağıdaki resimlerin nasıl saklandığına bir örnektir.

olması gerektiği Nasıl:

Orijinal dosya: fdk392ks93_39ei.png

küçük versiyonu: thumb_fdk392ks93_39ei.png

Ne kadar:

Orijinal dosya: fdk392ks93_39ei.png

thumbnail sürümü: thumb_fajeilkadifej_jakdjfi.png

Herhangi bir yardım çok takdir edilecektir.

Diğer bilgi:

Modeli: Kullanıcı

Uploader: user_image

+0

Düzenlendi kısmı: olması gerektiği Nasıl: Orjinal dosyayı: küçük resim sürümünü fdk392ks93_39ei.png: thumb_fdk392ks93_39ei.png Ne kadar: Orijinal dosya: küçük resim sürümünü fdk392ks93_39ei.png: – CorreyS

cevap

17

recreate_versions! arayarak sonra modele save! aramak zorunda. Birinin temelde aynı şeyi sorduğu this question'u kontrol edebilirsiniz.

8

README açıkça Carrierwave versiyonlarını yeniden nasıl devletler (bu da klasör/dosya adını saklar sütun adıdır):

https://github.com/jnicklas/carrierwave/blob/master/README.md

"sen geriye dönük cha istediğiniz bir duruma gelebilir Bir sürümü veya yeni bir tane ekleyin. Recreate_versions'ı kullanabilirsiniz! Temel dosyadan sürümleri yeniden oluşturma yöntemi. Bu, hiçbiri bir argüman olarak geçilmezse, belirtilen sürümü veya tüm sürümleri yeniden yükleyip işleyebilecek saf bir yaklaşım kullanır.

instance = MyUploader.new 
instance.recreate_versions!(:thumb, :large) 

Veya monte yükleyen üzerinde

:

User.all.each do |user| 
    user.avatar.recreate_versions! 
end 
+1

thumb_fajeilkadifej_jakdjfi.png Zaten modeli içinde bu denedi ama dosya isimleri takip etmez. Sorularımdaki kod, yeni sürümleri tamamen farklı bir dosya adı altında kaydetmesi dışında, kodun sürümün modelin bir parçası olduğunu tanımlamasına izin vermez. – CorreyS

+0

@CorreyS buna bir çözüm buldunuz mu? – Tommyixi

+0

Benim sorunum eski veritabanında eski bir görüntü vardı, eski veritabanını en son kaynak koduna klonladıktan sonra, amazon s3 deposunda sadece carrierwave tarafından yüklenen orijinal görüntü için küçük resim versiyonunu yenilemem gerekiyor. .recreate_versions! uploader dosyasında bildiren küçük resim sürümü oluşturmama yardımcı olmak için başarı. Teşekkürler. –