在我的Rails应用程序中,我允许用户将图像直接上传到S3,这会创建一个临时文件,在将图像记录保存到数据库中后会自动删除。
我不想在保存记录后自动删除图像,而是想在S3上设置文件的截止日期,以便在一段时间(比如24小时)后自动删除。
我看过有关如何在存储桶上设置过期日期的文档(http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/BucketLifecycleConfiguration.html),但我只想让存储桶中的某个文件夹自动删除文件。
有没有人有关于如何做的建议?
s3 = AWS::S3.new(:access_key_id => ENV['AWS_ACCESS_KEY_ID'], :secret_access_key => ENV['AWS_ACCESS_KEY'])
foldername = @image.s3_filepath.split("/")[5]
folder_path = 'uploads/' + foldername
s3.buckets[ENV['AWS_BUCKET']].objects.with_prefix(folder_path).each( #set expiration date header here)
答案 0 :(得分:2)
您可以在存储桶本身上设置生命周期配置,而不是每个单独的对象。使用其余的api,你只需写出一个xml配置(prefix
有一个字段,让你只将这个生命周期配置应用于那些以它为前缀的密钥)并将PUT
应用到存储桶中。 / p>
将其转换为ruby SDK,看起来示例 正在做你想要的事情; add_rule的第一个参数似乎是前缀。
答案 1 :(得分:0)
虽然您在存储桶上设置了生命周期,但您不能直接在存储桶对象上设置它。您需要使用AWS :: S3 :: BucketLifecycleConfiguration类。这里有更多关于如何管理生命周期的内容:
http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/BucketLifecycleConfiguration.html
答案 2 :(得分:0)
答案 3 :(得分:0)
我正在努力解决您所遇到的同一问题,而且看起来rails应用程序的AWS文档对于如何通过write
方法发送此参数没有太多说法。您可以在此处找到一些链接,说明如何将文件上传到S3存储桶AWS SDK for Ruby和Upload an Object Using the AWS SDK for Ruby。
#!/usr/bin/env ruby
require 'rubygems'
require 'aws-sdk'
bucket_name = '*** Provide bucket name ***'
file_name = '*** Provide file name ****'
# Get an instance of the S3 interface.
s3 = AWS::S3.new
# Upload a file.
key = File.basename(file_name)
s3.buckets[bucket_name].objects[key].write(:file => file_name)
puts "Uploading file #{file_name} to bucket #{bucket_name}."
这对我来说也是一个很好的来源Amazon S3: Cache-Control and Expiry Date difference and setting trough REST API,但他仍然没有提到如何设置过期日期,或者那里的任何答案或链接。
所以我浏览了代码本身的文档(我使用了aws-sdk-v1 gem),我在这里Method: AWS::S3::S3Object#write找到了所有可能允许我们配置上传的选项S3对象,但有两个似乎是为了相同的目的:
所以我开始查看我应该配置哪一个,我在这里Set content expires and cache-control metadata for AWS S3 objects with Ruby找到了我要找的东西:
require 'rubygems'
require 'aws-sdk'
s3 = AWS::S3.new(
:access_key_id => 'your_access_key',
:secret_access_key => 'your_secret_access_key')
bucket = s3.buckets['bucket_name']
one_year_in_seconds = 365 * 24 * 60 * 60
one_year_from_now = Time.now + one_year_in_seconds
# for a new object / to update an existing object
o = bucket.objects['object']
o.write(:file => 'path_to_file',
:cache_control => "max-age=#{one_year_in_seconds}",
:expires => one_year_from_now.httpdate)
# to update an existing object
o.copy_to(o.key,
:cache_control => "max-age=#{one_year_in_seconds}",
:expires => one_year_from_now.httpdate)
这就是我为配置过期日期和缓存控制所做的工作,以下是适用于我正在处理的应用的代码:
one_year_in_seconds = 365 * 24 * 60 * 60
files.each do |path, s3path|
#puts "Uploading #{path} to s3: #{File.join(prefix, s3path)}"
s3path = File.join(prefix, s3path) unless prefix.nil?
one_year_from_now = Time.now + one_year_in_seconds
bucket.objects[File.join(s3path)].write(
:file => path,
:acl => (public == true ? :public_read : :private),
:cache_control => "max-age=#{one_year_in_seconds}",
:expires => one_year_from_now.httpdate
)
end
同样在http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html,您可以找到必要的支持,帮助我完成配置expires
和cache_control
而非元数据的决定:
Cache-Control max-age指令允许您指定在CloudFront再次从源服务器获取对象之前,您希望对象保留在缓存中的时间长度(以秒为单位)。 CloudFront支持的最短到期时间为Web分发为0秒,RTMP分发为3600秒。最大值为100年。按以下格式指定值: 缓存控制:max-age =秒 例如,以下指令告诉CloudFront将关联对象保留在缓存中3600秒(一小时): 缓存控制:max-age = 3600 如果您希望对象在CloudFront边缘缓存中保留的持续时间与保留在浏览器缓存中的持续时间不同,则可以将Cache-Control max-age和Cache-Control s-maxage指令一起使用。有关更多信息,请参阅指定CloudFront为Web分发缓存对象的时间量。
Expires头字段允许您使用RFC 2616,超文本传输协议 - HTTP / 1.1第3.3.1节,完整日期中指定的格式指定到期日期和时间,例如: 2015年6月27日星期六23:59:59 GMT
关于您的问题,是的,您可以为存储桶中的每个对象指定过期日期和缓存控制日期。