2017-02-16 44 views
1

性能原因,我需要的是拇指版本保持png格式和擴展名。格式似乎正在轉換,但它一直保存帶有.jpg擴展名的圖像。Rails和Carrierwave,保存具有不同擴展名的版本

所以我有這樣的代碼爲我的頭像:

class UserAvatarUploader < CarrierWave::Uploader::Base 

    include CarrierWave::MiniMagick 

    version :large do 
     process resize_to_fit: [ 600, 600 ], convert: 'jpg' 
    end 

    version :small, from_version: :large do 
     process resize_to_fill: [ 216, 216 ], convert: 'jpg' 
    end 

    version :thumb, from_version: :small do 
     process resize_to_fill: [ 80, 80 ], convert: 'png' 
    end 

    version :tiny, from_version: :thumb do 
     process resize_to_fill: [ 50, 50 ], convert: 'png' 
    end 

    def filename 
     "#{secure_token}.#{file.extension}" if original_filename.present? 
    end 

    protected 

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

end 

,並保存圖像這樣的:

  • cbc9418c-ffaa-49da-A530-f940d3da2868.jpg
  • large_cbc9418c -ffaa-49da-a530-f940d3da2868.jpg
  • small_cbc9418c-ffaa-49da-a530-f940d3da2868.jpg
  • thumb_cbc9 418C-ffaa-49da-A530-f940d3da2868.jpg
  • tiny_cbc9418c-ffaa-49da-A530-f940d3da2868.jpg

甚至當我整個代碼改變爲:

class UserAvatarUploader < CarrierWave::Uploader::Base 

    include CarrierWave::MiniMagick 

    version :large do 
     process resize_to_fit: [ 600, 600 ], convert: :jpg 
    end 

    version :small do 
     process resize_to_fill: [ 216, 216 ], convert: :jpg 
    end 

    version :thumb do 
     process resize_to_fill: [ 80, 80 ], convert: :png 
    end 

    version :tiny do 
     process resize_to_fill: [ 50, 50 ], convert: :png 
    end 

end 

它不斷保存帶有jpg擴展名的圖像,WTF


我對此感到瘋狂,有什麼建議嗎?


UPDATE

我曾嘗試下一個代碼

class UserAvatarUploader < CarrierWave::Uploader::Base 

    include CarrierWave::MiniMagick 

    version :large do 
     process resize_to_fit: [ 600, 600 ], convert: :jpg 
    end 

    version :small do 
     process resize_to_fill: [ 216, 216 ], convert: :jpg 
    end 

    version :thumb do 
     process resize_to_fill: [ 80, 80 ], convert: :png 
    end 

    version :tiny do 
     process resize_to_fill: [ 50, 50 ], convert: :png 
    end 

    def filename 
    "#{secure_token}.#{file.extension}" if original_filename.present? 
    end 

    protected 

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

end 

它上傳正確的圖像,S3,但隨後user.avatar保存所有版本以.jpg WTF !!!!。這是很奇怪的,現在發生了什麼......

控制檯:

> user = User.find(id) 
> user.avatar.recreate_versions! 
> user.save! 
> user.avatar.large.url 
=> "http://bucket.s3.amazonaws.../large_96a1f5a4-cf07-490f-9711-618e04071950.jpg" 
> user.avatar.small.url 
=> "http://bucket.s3.amazonaws.../small_96a1f5a4-cf07-490f-9711-618e04071950.jpg" 
> user.avatar.thumb.url 
=> "http://bucket.s3.amazonaws.../thumb_96a1f5a4-cf07-490f-9711-618e04071950.png" 
> user.avatar.tiny.url 
=> "http://bucket.s3.amazonaws.../tiny_96a1f5a4-cf07-490f-9711-618e04071950.png" 
> reload! 
> user = User.find(id) 
> user.avatar.large.url 
=> "http://bucket.s3.amazonaws.../large_96a1f5a4-cf07-490f-9711-618e04071950.jpg" 
> user.avatar.small.url 
=> "http://bucket.s3.amazonaws.../small_96a1f5a4-cf07-490f-9711-618e04071950.jpg" 
> user.avatar.thumb.url 
=> "http://bucket.s3.amazonaws.../thumb_96a1f5a4-cf07-490f-9711-618e04071950.jpg" 
> user.avatar.tiny.url 
=> "http://bucket.s3.amazonaws.../tiny_96a1f5a4-cf07-490f-9711-618e04071950.jpg" 

我恨你CARRIERWAVE

+0

嘗試在版本塊內定義文件名方法。看看這個問題。它可以幫助你:https://github.com/carrierwaveuploader/carrierwave/issues/378 –

回答

1

有上CarrierWave的wiki一個條目,指出:

有另一種方式是改變格式。使用格式 方法將只會更改tmp文件的名稱。 的最終版本文件是通過載波命名的,儘管它創建的文件 將是具有正確MIME 類型的指定格式的真正文件,但其擴展名將不會被更改。我們需要使用文件名方法 來設置它。

如果您想更改文件名應覆蓋filename方法,包括擴展:

def filename 
    "#{secure_token}.#{file.extension}" if original_filename.present? 
    end 

你的問題,依賴於有多種格式,所以你可以做的是覆蓋版本塊內的filename方法。

version :thumb do 
    process resize_to_fill: [ 80, 80 ], convert: :png 
    def filename 
     "#{secure_token}.png" # I don't know if secure_token will be available here. 
    end 
end 

如果這真的pull request製作成主你可能會忘記所有上述的和簡單地傳遞rename: true現有轉換的輔助方法。至少在描述拉取請求時,開發人員似乎是這麼做的。

+0

它不工作的方式,我試圖與 高清full_filename(for_file = model.avatar.file) \t \t \t「大#_ {{secure_token} .jpg「 \t \t end etc,它會將正確的文件保存到'user.avatar',但只上傳jpg到S3 .... I HATE CARRIERWAVE – Bengala

+0

幫助我+1在 https: //github.com/carrierwaveuploader/carrierwave/issues/2127,https://github.com/carrierwaveuploader/carrierwave/issues/2126和https://github.com/carrierwaveuploader/carrierwave/issues/2125 – Bengala

+0

這看起來像這樣一個明顯的特點。我真的不知道它爲什麼不在轉換時自己重命名文件。如果你得到它的工作,請更新這個答案,因爲其他人肯定會需要它。 –

相關問題