2017-02-16 57 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 о том, что:

Eсть другой улов с изменением формата. Использование метода изменит только имя файла tmp. Окончательная версия файл назван несущей волной, и хотя файл, который он создает , будет подлинным файлом указанного формата с правильным типом , его расширение не будет изменено. Для этого необходимо использовать метод имени файла .

Если вы хотите изменить имя файла, вы должны переопределить метод 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 " large _ # {secure_token} .jpg " \t конец и т. д. и он сохраняет правильные файлы на« user.avatar », но загружает только jpg на S3 .... Я ненавижу 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

Это похоже на такие очевидная особенность. Я действительно не могу понять, почему он не переименовывает файлы сам по себе при конвертации. Если вы его работаете, пожалуйста, обновите этот ответ, потому что другим людям это обязательно понадобится. –