使用Amazon-SDK Ruby gem在Amazon S3上上传文件后更新内容类型

Pau*_*aul 4 ruby amazon-s3

我正在运行一个脚本,在已经上传到S3存储桶后,会更新某些S3对象上的元数据字段.在初始化时,我通过检查文件名来设置内容类型.

def save_to_amazon(file, s3_object, file_name, meta_path)
  puts "uploaded #{file} to Amazon S3"
  content_type = set_content_type(file_name)
    s3_object.write(file.get_input_stream.read, :metadata => { :folders => meta_path}, :content_type => content_type)
end
Run Code Online (Sandbox Code Playgroud)

此时,S3内容类型适用于这些对象.我稍后更新元数据时会出现问题.我运行这样的事情:

s3_object.metadata['folders'] = "some string"
Run Code Online (Sandbox Code Playgroud)

此时,我s3_objects.content_type在更新元数据后运行时返回一个空字符串.

s3_object.content_type = 不可用.

据我所知,在阅读Rdoc时,没有办法在上传S3文件后分配内容类型.我尝试过使用元数据方法

s3.object.metadata['content_type'] = "some string"
s3.object.metadata['content-type'] = "some string"
Run Code Online (Sandbox Code Playgroud)

这两个似乎都分配了一个新的自定义元数据属性,而不是更新对象的mime类型.

有没有办法设置这个,还是我需要再次完全重新上传文件?

Pau*_*aul 9

详细说明tkotisis响应,这是我使用copy_to更新内容类型的方法.您可以使用s3object.head [:metadata]来提取现有元数据以将其复制到此处引用.

amazon_bucket.objects.each do |ob|
    metadata = ob.head[:metadata]
    content_type = "foo/bar"
    ob.copy_to(ob.key, :metadata => metadata, :content_type => content_type)
end
Run Code Online (Sandbox Code Playgroud)

编辑

amazon_bucket.objects.each do |ob|
    metadata = ob.metadata
    content_type = "foo/bar"
    ob.copy_to(ob.key, :metadata{:foo => metadata[:foo]}, :content_type => content_type)
end
Run Code Online (Sandbox Code Playgroud)


tko*_*sis 7

您的示例代码仅修改您的内存中对象.要修改实际S3对象的元数据,请使用目标键发出复制请求,该复制请求是当前对象之一.

编辑

根据文件

使用复制操作,您可以通过复制和删除原始对象来重命名对象.

复制对象时,您可能决定更新某些元数据值.例如,如果源对象配置为使用标准存储,则可以选择将减少的冗余存储用于对象副本.您还可以决定更改源对象上存在的一些用户定义的元数据值.请注意,如果您选择在复制期间更新对象的任何用户可配置元数据(系统或用户定义),则必须显式指定所有用户可配置元数据,即使您只更改其中一个元数据值,在您的请求中的源对象上.

我没有尝试过,但使用Ruby SDK这可能是通过

- (S3Object) copy_to(target, options = {})
Run Code Online (Sandbox Code Playgroud)

方法.