2010-12-05 30 views
13

Ben şu var: ataş ekleri olanRaylar 3 - Tempfile Yolu?

attachments.each do |a| 
    Rails.logger.info a.filename 
    tempfile = Tempfile.new("#{a.filename}", "#{Rails.root.to_s}/tmp/") 
    Rails.logger.info tempfile.path 
end 

.

billgates.jpg 
/Users/bhellman/Sites/cline/tmp/billgates.jpg20101204-17402-of0u9o-0 

Neden dosya adı sonunda eklenmiş 20101204-17402-of0u9o-0 oluyor: İşte

çıktı mı? Bu, her şeyi ataç vb. Ile kırıyor. Bunu daha önce gören var mı? Hayatı için ne yaptığını bilmiyorum.

Teşekkür

GÜNCELLEME Paperclip: Paperclip on github

bir Tempfile.new için ilk argüman sadece basename olan ek dosya

tempfile = Tempfile.new("#{a.filename}", "#{Rails.root.to_s}/tmp/") 
tempfile << a.body 
tempfile.puts 
attachments.build(
    :attachment => File.open(tempfile.path) 
) 
+0

Neden sadece file.New yerine Tempfile.new kullanılır? –

+0

İyi soru. Heroku dostu olmalı ve doktorları tempfile kullanmayı mı söylüyor? – AnApprentice

+0

Bir çakışma varsa File.New sonu olmaz mı? – AnApprentice

cevap

4

olduğunu. Her Tempfile'ın benzersiz olduğundan emin olmak için, karakterler dosyanın sonuna eklenir.

+0

Teşekkürler John, ama bu Paperclip'i kırıyor, ki bunu yapıyor: attachment => File.open (tempfile.path), bu tempfile, dosya adına eklenen tüm rastgele olmadan nasıl atabilirim? teşekkürler – AnApprentice

+0

Ben ataş ile ne yapmaya çalıştığınızdan emin değilim. Varsayılan yolu değiştirmeye mi çalışıyorsunuz? – drummondj

+0

Şu an Paperclip'te sahip olduğum şey:: attachment => File.open (tempfile.path), Sorun, s3 dosyasına dosya yüklediğinde senkr dosya adı geçici dosya adını kullanır. Bu nedenle dosya adının, ataçmana göndermeden önce temizlenmesi/düzeltilmesi gerekir. – AnApprentice

0

Bunun için ataç API'sini kullanmalıdır: Bunu başa bulundu

tempfiles = [] 
attachments.each do |a| 
    # use Attachment#to_file to get a :filesystem => file, :s3 => tempfile 
    tempfiles << a.to_file 
end 

tempfiles.each do |tf| 
    Rails.logger.debug tf.filename 
end 
+0

I Yukarıdaki öneriyle neyin değiştiğini anlamadım? Tempfile tarafından verilen çılgın rastgele dosya adından kaçınmak için ne yapılıyor? – AnApprentice

+0

Sorunu düşündüğünüzde, dosyaları depolamadan aldığınızda temp dosyalarının tekil dosya adları vardı. – yfeldblum

+0

tempfile, ve sonra (: attachment => File.open (tempfile.path) eki kaydetmek için ataç göndermek, o ataç dosya adını tempfile alır var.Bu sorun, bu noktada dosya adı tempfile. – AnApprentice

0
attachment = attachments.build(
    :attachment => File.open(tempfile.path) 
) 

# change the displayed file name stored in the db record here 
attachment.attachment_file_name = a.filename # or whatever else you like 

attachment.save! 
+1

bunu denedi ancak sorun şu ki S3'teki dosya adı güncellenmiyor. Sadece db dosyasındaki dosya adı, daha sonra dosyayı geçersiz kılan bağlantıyı geçersiz kılar. – AnApprentice

+1

Kayıt dosyasını kaydetmeden önce dosya adını değiştirin veya dosya adı S3'ün göreceği gibi dosya adındaki tempfile eklemeyin. – yfeldblum

0

iyi yolu Paperclip özelliğinde dosya uzantısını belirtmek oldu. url '.jpg' yerine geleneksel .:extension olarak ilan edilir:

has_attached_file :picture, 
    :url => "/system/:hash.jpg", 
    :hash_secret => "long_secret_string", 
    :storage => :s3, 
    :s3_credentials => "#{Rails.root}/config/s3.yml" 

Not olun: Örneğin.

İyi şanslar! En iyi

21

sizin tempfile çalışırken sizi kurtaran, doğru uzantısı olduğundan emin olun ve sonra bunu değiştirmek: = Tempfile.new

dosya ([ 'merhaba', '.jpg'])

file.path # => gibi bir şey: "/tmp/hello2843-8392-92849382--0.jpg" burada

daha: http://apidock.com/ruby/v1_9_3_125/Tempfile/new/class

+1

benim için çalıştı. +1 – sylv3rblade

+0

Doğru cevap budur –