Rails + Carrierwave + MiniMagick: Как сохранить анимацию GIF? - PullRequest
0 голосов
/ 05 апреля 2019

Когда я загружаю изображения в формате gif через Carrierwave и MiniMagick, анимация удаляется.Я перепробовал много решений ...

В этой загрузке есть любопытство.Если я поставлю тип изображения, он вернет «image / png», но я отправил gif.Я пробовал и с другими файлами.

файл app / uploaders / image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base

    include CarrierWave::MiniMagick

    storage :aws

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

    def fix_exif_rotation
        manipulate! do |img|
            img.tap(&:auto_orient)
        end
    end

    version :thumb do
        process resize_to_limit: [150, 100000]
        process :quality => 90
        process :fix_exif_rotation
    end

    version :original do
        process :quality => 90
        process :fix_exif_rotation
    end

    def extension_white_list
        %w(jpg jpeg gif png)
    end

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

    private

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

end

Если я изменю оригинал версии на:

version :original do
    process :get_image_type
    process :quality => 90
    process :fix_exif_rotation
end

def get_image_type
    puts @file.content_type
end

В консоли (rails s) возвращает «image / png».Я пытаюсь применить это решение , но не работает, и я подозреваю, что проблема связана с неправильным типом содержимого.

Мой env

rails -v: Rails 4.2.1
ruby -v: ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
carrierwave-aws: 1.2.0
mini_magick: 4.8.0
OS: Ubuntu 16.04.5 LTS

1 Ответ

0 голосов
/ 05 апреля 2019

Проблема с DropzoneJS.Все загруженные файлы были изменены локально.При изменении размера GIF с помощью DropzoneJS он будет преобразован в формат PNG.

Затем Carrierwave отправит на сервер файл PNG с расширением GIF.

Мои окончательные настройки DropzoneJS (которые работают) это:

$('.dropzone').dropzone({
    paramName: 'attachment[image]',
    maxFilesize: 3,
    thumbnailWidth: 189,
    previewsContainer: '#sended-images',
    previewTemplate: $('#preview').html(),
    timeout: 360000,
    acceptedFiles: 'image/*,.jpg,.png,.jpeg,.gif',
    accept: function(file, done) {
        var mime_type = file.type;
        if ( mime_type != 'image/gif' ){
            this.options.resizeWidth = 1800;
            this.options.resizeQuality = 90;
            done();
        } else {
            this.options.resizeWidth = null;
            this.options.resizeQuality = null;
            done();
        }
        file.status = Dropzone.ADDED;
        done();
    },
    init:function(){
        this.on('success',function(f,d){
            ...
        });
        this.on('sending',function(f,x,d){
            ...
        });
        this.on('addedfile',function(f,x,d){
            ...
        });
        this.on('error', function(f, response) {
            ...
        });
        this.on("maxfilesexceeded", function(file){
            ...
        });
    }
});

Моя уникальная проблема здесь:

Если я отправлю несколько файлов, GIF-файл которых обрабатывается первым, размер следующих файлов не изменится.Если первый обработанный файл не является GIF, размер следующих файлов будет изменен, и GIF не будут работать.

...