2013-04-04 10 views
7

Klasör yapısını yeniden düzenlemek için dosyaları CarrierWave kullanarak S3 kabımın etrafına taşımayı deniyorum.Varolan bir klasör hiyerarşisini CarrierWave ile nasıl yeniden düzenleyebilirim?

Bir sınıf için tüm görüntülerin adlı bir klasöre yüklenmekte olduğu mevcut bir Rails uygulamasına geldim. Bu, iki kullanıcının aynı dosya adına sahip farklı resimler yüklediğinde, ikinci görüntünün ilkin üzerine yazılması sorunlara neden olur. Bunu çözmek için, her görüntüyü ActiveRecord nesne örneğine göre kendi dizinine yerleştirmek için klasörleri yeniden düzenlemek istiyorum. Dosya yüklemelerini yönetmek için CarrierWave kullanıyoruz. Ben yeni dosya depolama düzeni yansıtacak şekilde yöntemini modifiye

def store_dir 
    "uploads" 
end 

:

eski yükleyici kodu aşağıdaki yöntemi vardı

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

Bu yeni görüntüler için harika çalışıyor, ancak url kırar eski görüntüler için. Mevcut resimler, modelini değiştirdiğimde hemen yeni klasörün içinde olmak üzere URL'lerini bildiriyor, görüntü dosyaları ise 'da saklanıyor.

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

Bu doğru değil. Bu nesne logosunu /uploads numaralı telefondan bildirmelidir.

Çözümüm, resim dosyalarını taşımak için bir komut dosyası yazmaktır, ancak dosyaları taşımak için CarrierWave uygulamasında doğru yöntemleri bulamadım. Benim komut dosyası aşağıdaki gibi görünecektir:

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 

Ben yeni bir konuma dosya taşımak için Senaryomun hattında üç yapmak gerekir?

+1

Hiç bir çözüm buldunuz mu? Bende aynı sorun var. –

+0

Bu, sis kullanmıyorsanız, belki de sizin için geçerli değildir, ancak bu, bulduğum en iyi çözümdür ve oldukça zor görünüyordum: http: //stackoverflow.com/questions/19038733/need-to- dosya-in-an-s3-bucket-carrierwave-f değiştirmek-depolama-dizin- –

cevap

14

UYARI: Bu test edilmemiştir, testten önce lütfen üretimde kullanmayın.

İşte 'store_dir' içeriğini değiştirirseniz, eski yüklemeleriniz kaybolur. Bunu zaten biliyorsun. S3 ile doğrudan etkileşim kurmak, bunu çözmenin en bariz yolu gibi görünüyor, çünkü carrierwave'in bir hareket fonksiyonu yoktur.

Çalışılabilecek bir şey, yüklemelerinizi yeniden kaydetmeniz ve 'store_dir' yolunu 'before: store' geriçağırımında değiştirmeniz olacaktır. senin yükleyen olarak

: Bundan sonra

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

dosyaların doğru yerlere kopyalanmış doğrulayın:

#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 

Ve sonra böyle bir komut dosyasını çalıştırın. Eski yükleme dosyalarını silmeniz gerekir. Ayrıca, yukarıda bir süre kullanmak yükleyici kodunu kaldırmak ve yeni store_dir yolu ile değiştirin:

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

Bunu test etmedim, bu yüzden işe yarayacak garanti edemez. Herhangi bir başarı elde ederseniz, çalışıp çalışmadığınızı görmek için lütfen önce test verilerini kullanın.

+0

Benim için mükemmel çalıştı. Göz kırparak binlerce dosyayı taşıdım. Şerefe. –

+0

Değiştir_script ile ilgili sorun yaşadım. Ancak, carrywave olmadan üretimdeki klasörleri ve dosyaları değiştirebilirsiniz. –

İlgili konular