carrierwave-upyun配置多个不同buckets
背景 #
carrierwave是RubyOnRails社区中比较 流行的文件上传插件,carrierwave-upyun 是集成upyun服务的插件。
把不同类型的文件存放到upyun不同的bucket上 #
使用upyun时有个常见的需求就是把不同类型的图片分开放到不同的bucket当中,但在 carreirwave-upyun的文档当中并没有提到这点,只是给出了怎么配置全局参数的例子:
CarrierWave.configure do |config|
config.storage = :upyun
config.upyun_username = "xxxxxx"
config.upyun_password = 'xxxxxx'
config.upyun_bucket = "my_bucket"
config.upyun_bucket_domain = "my_bucket.files.example.com"
end
解决 #
而实际上,可以这么去做:
class CoverUploader < CarrierWave::Uploader::Base
storage :upyun
self.upyun_bucket = "my-covers"
end
class AttachementUploader < CarrierWave::Uploader::Base
storage :upyun
self.upyun_bucket = "my-attachements"
end
这样简单地在Uploader里assign一下就可以解决问题。
为什么以上的解决方法行得通? #
Carreirwave的各种Configuration都是通过这里的add_config
方法加入的。代码可以看以下的链接
add_config
为每个Uploader实例添加了直接访问Class variable的方法,Uploader中
的各种Configuration 项(比如这里的upyun_bucket
)都是存储在Uploader的Class
中。
而所有默认的Configuration项都是存储在CarrierWave::Uploader::Base
,所以在我们
自定义的Uploader可以通过add_config
为我们加入的self.#{config_item}=
去修改Configuration项。
也就是说Carrierwave一早就实现了这样的机制让不同的Uploader天生可以具有配置能力。