如何使用Shrine gem获取并保存Amazon S3文件的ETag值?
用Shrine上传至S3后获取ETag并存入数据库
当然可以直接从S3上传响应中获取ETag,无需额外请求S3,以下是具体实现步骤:
提取ETag并添加到文件元数据
借助Shrine的add_metadata插件,从S3上传响应中提取ETag(注意S3返回的ETag带双引号,需要去除):# 初始化Shrine时配置 Shrine.plugin :add_metadata Shrine.add_metadata :etag do |_io, context| # 仅在上传到S3存储时提取ETag next unless context[:storage].is_a?(Shrine::Storage::S3) && context[:phase] == :store context[:response]['ETag'].delete('"') if context[:response] end将ETag同步到数据库字段
假设你的模型(比如Photo)有单独的etag数据库字段,可通过模型回调将元数据中的ETag同步过去:class Photo < ApplicationRecord include ImageUploader::Attachment(:image) after_save :sync_etag_to_db private def sync_etag_to_db return unless image&.metadata&.key?('etag') && etag != image.metadata['etag'] update_column(:etag, image.metadata['etag']) end end或直接在上传回调中更新数据库
也可以在上传器中通过after_upload回调直接获取响应中的ETag并更新模型:class ImageUploader < Shrine plugin :activerecord plugin :after_upload after_upload do |_uploader, file, context| next unless file.storage.is_a?(Shrine::Storage::S3) etag = file.response['ETag'].delete('"') context[:record].update_column(:etag, etag) end end
上述两种方式都是直接从S3上传的响应中获取ETag,不会额外发起S3请求,完全满足你的需求。
内容的提问来源于stack exchange,提问作者TenJack
相关产品推荐
相关产品推荐

