2017-02-16 3 views
1

Was ich aus Leistungsgründen brauche, ist, dass die Thumb-Versionen das PNG-Format und die Erweiterung beibehalten. Das Format scheint korrekt zu konvertieren, speichert aber die Bilder mit .jpg-Erweiterungen.Rails und Carrierwave, speichern Versionen mit verschiedenen Erweiterungen

So habe ich diesen Code für meinen Benutzer Avatar:

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 

Und es speichert die Bilder wie folgt aus:

  • 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

Auch wenn ich ändern den gesamten Code zu:

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 

Es speichert alle Bilder mit der Erweiterung jpg, WTF.


ich mit diesem gehe verrückt, irgendwelche Vorschläge?


UPDATE

Ich habe den nächsten Code versucht

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 

Und es lädt die richtigen Bilder zu S3, aber dann speichert user.avatar alle Versionen in .jpg WTF !!!!. Es ist wirklich seltsam, was jetzt passiert ...

Console:

> 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" 

I SIE

+0

Versuchen Sie, die Dateiname-Methode im Versionsblock zu definieren. Sehen Sie sich dieses Problem an. Es könnte Ihnen helfen: https://github.com/carrierwaveuploader/carrierwave/issues/378 –

Antwort

1

CARRIERWAVE HASSE Es ist ein Eintrag auf CarrierWave der wiki besagt, dass:

Es gibt ein weiterer Haken beim Ändern des Formats. Bei Verwendung des Formats wird nur der Name der tmp-Datei geändert. Die endgültige Version von die Datei wird von Trägerwelle benannt und obwohl die Datei, die es erstellt wird eine echte Datei des angegebenen Formats mit dem richtigen Mime Typ, wird es Erweiterung wird nicht geändert werden. Wir müssen die Dateiname verwenden, um dies festzulegen.

Wenn Sie den Dateinamen ändern möchten, sollten Sie die filename Methode und auch die Erweiterung außer Kraft setzen:

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

Ihre Probleme, so dass mehrere Formate auf, die beruht, was Sie ist die außer Kraft tun konnte, filename Methode innerhalb des Versionsblocks.

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 

Wenn diese pull request wirklich in Master gemacht können Sie alle oben genannten vergessen und einfach rename: true an die bestehende konvertieren Helfer-Methode übergeben. Zumindest scheint es, was der Entwickler für die Beschreibung der Pull-Anfrage wollte.

+0

es nicht so funktioniert, ich habe versucht, mit def full_filename (for_file = model.avatar.file) \t \t \t " große _ # {secure_token} .jpg“ \t \t Ende etc und es speichert die richtigen Dateien zu 'user.avatar' tun, sondern nur Uploads jpg bis S3 .... iCH HASSE CARRIERWAVE mich in https mit +1 – Bengala

+0

Hilfe: //github.com/carrierwaveuploader/carrierwave/issues/2127, https://github.com/carrierwaveuploader/carrierwave/issues/2126 und https://github.com/carrierwaveuploader/carrierwave/issues/2125 – Bengala

+0

Das scheint so zu sein ein offensichtliches Merkmal. Ich kann wirklich nicht sagen, warum es Dateien beim Konvertieren nicht selbst umbenennt. Wenn es funktioniert, bitte aktualisieren Sie diese Antwort, weil andere Leute es definitiv brauchen werden. –

Verwandte Themen