1

我正在使用carrierwave_direct,它将文件直接上传到S3。我需要将文件信息保存到数据库中 - 例如文件类型和大小。好奇最好的方法是什么?

4

2 回答 2

1

该线程所述,最佳方法是使用head_object方法,该方法不下载文件本身的内容。

sdk-for-ruby 文档: HEAD 操作从对象中检索元数据而不返回对象本身。如果您只对对象的元数据感兴趣,此操作很有用。要使用 HEAD,您必须对对象具有 READ 访问权限。

因此,对于 file_size 和 file_type 您可以:

require 'aws-sdk-s3'

s3 = Aws::S3::Client.new(
  region:               'us-east-1',     #or any other region
  access_key_id:        AWS_ACCESS_KEY_ID,
  secret_access_key:    AWS_SECRET_ACCESS_KEY
)

res = s3.head_object(bucket: bucket_name, key: object_key)
file_size = res[:content_length]
file_type = res[:content_type]
于 2020-09-07T21:59:50.530 回答
0

最好的方法是使用imagemagick identify 命令。就在您保存文件之前/之后,您需要计算它的大小。该文件必须是本地的(因此如果它已经在 S3 上,您必须再次下载它):

identify the-image.jpg
#=> rose.jpg JPEG 640x480 DirectClass 87kb 0.050u 0:01

它将输出一个您必须解析的字符串。RMagick 有一个 api,它会自动为您提供宽度/高度/类型,但我似乎找不到它(这可能会有所帮助:RMagick 返回 nil 读取 JPEG)。

于 2012-07-25T04:21:46.070 回答