我有一个非 Rails 服务生成文件然后将其上传到 S3。我希望我的 Rails 应用程序为每个创建一个 Activestorage 记录,以便每个
FileResult
has_one_attached
file
或类似内容可以在 Rails 应用程序中引用。
我这里有不需要重新上传的选项吗?
原则上是可能的,但我无法弄清楚如何修复校验和计算。
我的用例:
解决方案: 我已使用
aws-sdk-s3
从 S3 存储中读取有关该对象的信息。
s3_object = MyStorageService.new.object
key = s3_object.key
blob = ActiveStorage::Blob.create_and_upload! key: key,
filename: File.basename(key),
byte_size: s3_object.size,
checksum: s3_object.etag
record = Record.find(1)
record.image.attach(blob)
问题是 S3 生成的校验和与 ActiveStorage 计算的校验和不同 (
OpenSSL::Digest::MD5.file(local_image_path).base64digest
)。当访问或修改 blob 时,这会引发 ActiveStorage::IntegrityError
,从而使该解决方案毫无用处。
我最终使用 ActiveStorage 下载并重新上传图像。