恢复S3已删除对象后Rails CMS关联的Active Storage资源仍无法加载
Active Storage S3删除标记恢复后无法加载解决方案
你遇到的问题是Rails 5.2版本Active Storage的内置缓存逻辑与S3版本控制恢复的状态不同步导致的,不需要重建资源关联,按以下步骤操作即可恢复访问:
- 清除Active Storage的S3对象存在性缓存
Rails 5.2的Active Storage默认会缓存S3对象的存在状态24小时,你可以在Rails控制台执行以下命令清除缓存:
# 全局清除S3服务的存在性缓存 ActiveStorage::Blob.services.fetch(:amazon).cache.clear # 若仅部分文件受影响,可针对性清除指定blob的缓存 ActiveStorage::Blob.where(id: [你需要恢复的blob ID范围]).each do |blob| blob.service.send(:cache).delete(blob.key) end
- 同步本地Blob元数据与S3实际文件信息
删除标记恢复后,可能出现本地存储的文件元数据(大小、校验值、类型)与S3实际文件不匹配的情况,可执行以下代码批量同步:
ActiveStorage::Blob.where(id: [你需要恢复的blob ID范围]).each do |blob| next unless blob.service.exist?(blob.key) s3_obj = blob.service.bucket.object(blob.key) blob.update!( byte_size: s3_obj.content_length, checksum: Base64.strict_encode64(s3_obj.etag.delete('"')).chomp, content_type: s3_obj.content_type ) end
- 清除缓存的访问链路
如果你的S3前面配置了CDN服务(如CloudFront),需要对受影响的文件路径执行缓存失效操作,避免CDN继续返回之前缓存的404状态。无CDN的情况下可直接清除浏览器缓存测试访问。
Comfortable Mexican Sofa的附件关联直接绑定Active Storage的Blob记录,只要Blob记录未删除就无需额外调整CMS配置,完成上述操作后资源即可正常加载。
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

