我正在运行一个脚本,在已经上传到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类型.
有没有办法设置这个,还是我需要再次完全重新上传文件?
详细说明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)
您的示例代码仅修改您的内存中对象.要修改实际S3对象的元数据,请使用目标键发出复制请求,该复制请求是当前对象之一.
编辑
根据文件
使用复制操作,您可以通过复制和删除原始对象来重命名对象.
复制对象时,您可能决定更新某些元数据值.例如,如果源对象配置为使用标准存储,则可以选择将减少的冗余存储用于对象副本.您还可以决定更改源对象上存在的一些用户定义的元数据值.请注意,如果您选择在复制期间更新对象的任何用户可配置元数据(系统或用户定义),则必须显式指定所有用户可配置元数据,即使您只更改其中一个元数据值,在您的请求中的源对象上.
我没有尝试过,但使用Ruby SDK这可能是通过
- (S3Object) copy_to(target, options = {})
Run Code Online (Sandbox Code Playgroud)
方法.
| 归档时间: |
|
| 查看次数: |
10743 次 |
| 最近记录: |