如何从现有 S3 对象创建 ActiveStorage::Blob?

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

我有使用分段上传上传到 S3 的对象。我无法编辑将对象上传到 S3 的代码。我想创建一个

ActiveStorage
附件来将此 S3 对象和其他对象连接到他们各自的记录。

我首先手动创建一个

ActiveStorage::Blob

ActiveStorage::Blob.create(
  key: <key of S3 object>,
  filename: <name of file>,
  content_type: "application/zip",
  service_name: <my S3 service name>,
  byte_size: <fake byte size, this is not used>
)

从那里,我希望我最终可以创建附件,但我无法创建没有校验和的

Blob
。当我创建此 Blob 对象并将该 Blob 附加到记录时,如何计算 S3 对象的校验和?

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

您可以获得S3对象HEAD,以避免下载所有文件内容。 然后你就可以得到S3对象的etag(对应上传文件内容的校验和)。

s3_client = Aws::S3::Client.new
s3_object = s3_client.head_object(bucket: "{your bucket}", key: "{your file key}")

ActiveStorage::Blob.create(
  key: "{your file key}"
  filename: "{your file name}",
  content_type: "{your file content type}",
  service_name: "{your storage service name}",
  byte_size: s3_object.content_length,
  checksum: s3_object.etag.gsub(/"/, "")
)

下面是作为对 S3 对象的 HEAD 请求的结果返回的对象的示例。

#<struct Aws::S3::Types::HeadObjectOutput delete_marker=nil,
  accept_ranges="bytes",
  expiration=nil,
  restore=nil,
  archive_status=nil,
  last_modified=2024-10-06 06:58:44 +0000,
  content_length=746,
  checksum_crc32=nil,
  checksum_crc32c=nil,
  checksum_sha1=nil,
  checksum_sha256=nil,
  etag="\"0fcee1ed3dfcaf51dc19f5eff24ef212\"",
  missing_meta=nil,
  version_id=nil,
  cache_control=nil,
  content_disposition=nil,
  content_encoding=nil,
  content_language=nil,
  content_type="application/vnd.apple.mpegurl",
  expires=nil,
  expires_string=nil,
  website_redirect_location=nil,
  server_side_encryption="AES256",
  metadata={"mediaconvert-jobid"=>"1728197556867-cg8iev"},
  sse_customer_algorithm=nil,
  sse_customer_key_md5=nil,
  ssekms_key_id=nil,
  bucket_key_enabled=nil,
  storage_class=nil,
  request_charged=nil,
  replication_status=nil,
  parts_count=nil,
  object_lock_mode=nil,
  object_lock_retain_until_date=nil,
  object_lock_legal_hold_status=nil
>
© www.soinside.com 2019 - 2024. All rights reserved.