2015-11-02 162 views
0

我想用aws-sdk删除从我的S3存储一个文件,但至今没有运气... AWS S3 delete_object方法返回DeleteObjectOutput结构所有nil属性:如何从Amazon S3中删除对象?

#<struct Aws::S3::Types::DeleteObjectOutput delete_marker=nil, version_id=nil, request_charged=nil> 

但后来当我检查的文件夹我的桶中的目录我可以看到一个文件仍然存在。

代码如下。

的Gemfile

gem 'aws-sdk', '~> 2' 

配置/初始化/ AWS-sdk.rb

Aws.config.update({ 
    region: 'us-west-2', 
    credentials: Aws::Credentials.new(
     ENV['AWS_ACCESS_KEY_ID'], 
     ENV['AWS_SECRET_ACCESS_KEY']) 
}) 

my_controller.rb

s3 = Aws::S3::Client.new 
response = s3.delete_object({ 
    bucket: ENV['S3_BUCKET_NAME'], 
    key: params[:attachment_url] 
}) 
# response == <struct Aws::S3::Types::DeleteObjectOutput delete_marker=nil, version_id=nil, request_charged=nil> 
+1

你的URL可能是错误的。 – djechlin

回答

0

好,我的密钥不是直接指向文件,而是指向包含该文件的文件夹。正如你所看到的,我在文件名中使用了斜杠来区分文件夹。

key = 'one/two/three/file.png' 

但不知我原因,这些斜线(在文件上传到S3)被S3替换为%2F字符。

为了成功删除文件,我需要在将密钥传递给delete_object方法之前将%2F转换回'/'。干杯:)

=======

但它仍然不是很好,从亚马逊到不返回任何消息,无论是有关删除是succesfull或不...

+1

您没有收到错误,因为S3上的DELETE是一个幂等操作 - 如果请求被授权,它总是成功。遵循逻辑:在成功的删除操作之后,文件不存在...对吗?现在...如果它在你试图删除它之前并不存在,那么在删除一个不存在的对象之后,它在技术上仍然是真实的,然后它仍然不存在。因此,在技术上,您的请求“成功”,因为现在它确实不存在,就像它在删除之前存在的情况一样。 –