当我通过Carrierwave和MiniMagick上传gif图像时,动画将被删除。我尝试了很多解决方案......
这个上传有好奇心。如果我把图像类型,它返回“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”。我正在尝试应用this solution,但不起作用,我怀疑问题是错误的content_type。
我的环境
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
问题出在DropzoneJS上。所有上传的文件都在本地调整大小。当DropzoneJS调整GIF大小时,它将被平展并转换为PNG。
然后,Carrierwave向服务器发送了带有GIF扩展名的PNG文件。
我最后的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将不起作用。