我有使用分段上传上传到 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 对象的校验和?
您可以获得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
>