Rails中RefineryCMS使用Dragonfly时无法修改图片S3存储路径问题
RefineryCMS Dragonfly S3 存储路径不一致解决方案
问题根源
- 你之前修改的是全局Dragonfly实例的配置,但RefineryCMS的图片模块使用独立的
:refinery_imagesDragonfly实例,全局配置不生效 url_format参数仅控制访问链接的生成规则,对文件实际存储路径无影响- Refinery自带的
datastore_root_path配置仅对本地文件存储生效,S3存储模式下需手动指定路径生成规则
具体修改步骤
第一步:调整config/initializers/refinery/images.rb配置
将原有配置替换为如下内容:
# config/initializers/refinery/images.rb # encoding: utf-8 Refinery::Images.configure do |config| # 开启S3存储 config.s3_datastore = true config.s3_bucket_name = ENV['S3_BUCKET'] config.s3_access_key_id = ENV['S3_KEY'] config.s3_secret_access_key = ENV['S3_SECRET'] config.s3_region = 'us-east-1' # 保留原有配置 config.dragonfly_verify_urls = false end # 自定义S3存储路径规则,匹配原有本地存储格式 Refinery::Images.dragonfly_app.configure do # 如需保持原有访问链接格式,可取消注释下面一行 # url_format "/system/refinery/images/:job/:name" datastore :s3, bucket_name: ENV['S3_BUCKET'], access_key_id: ENV['S3_KEY'], secret_access_key: ENV['S3_SECRET'], region: 'us-east-1', url_scheme: 'https', # 自定义路径生成逻辑,和原有本地路径格式完全对齐 path: proc { |attachment, _| create_time = attachment.created_at || Time.current year = create_time.year month = create_time.month.to_s.rjust(2, '0') day = create_time.day.to_s.rjust(2, '0') random_str = SecureRandom.alphanumeric(10).downcase "refinery/images/#{year}/#{month}/#{day}/#{random_str}_#{attachment.name}" } end
第二步:清理全局Dragonfly冗余配置
删除config/initializers/dragonfly.rb中的全局S3存储配置,保留其他原有配置即可,避免多实例配置冲突。
历史数据迁移说明
将原有服务器public/system/refinery/images/目录下的所有文件按照原目录结构直接同步到S3桶的refinery/images/路径下即可,历史文件和新上传文件的访问逻辑完全一致,无需额外修改。
内容的提问来源于stack exchange,提问作者Rahul Rajput
相关产品推荐
相关产品推荐

