为已存在的文件创建 Activestorage 记录

问题描述 投票:0回答:1

我有一个非 Rails 服务生成文件然后将其上传到 S3。我希望我的 Rails 应用程序为每个创建一个 Activestorage 记录,以便每个

FileResult
has_one_attached
file
或类似内容可以在 Rails 应用程序中引用。

我这里有不需要重新上传的选项吗?

ruby-on-rails amazon-s3 ruby-on-rails-5 rails-activestorage
1个回答
0
投票

原则上是可能的,但我无法弄清楚如何修复校验和计算。

我的用例:

  1. 用户将图像上传到S3
  2. 我想重复使用该图像以避免再次下载和上传

解决方案: 我已使用

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 下载并重新上传图像。

© www.soinside.com 2019 - 2024. All rights reserved.