Carrierwave不会从S3中删除已删除的文件

时间:2013-05-05 01:40:59

标签: ruby-on-rails ruby-on-rails-3 amazon-s3 carrierwave fog

我有2个Carrierwave上传器 - ItemUploaderImageUploader,我正在使用雾。

我可以很好地将文件上传到S3,但是执行销毁不会将其从S3中删除。

这是我的destroy行动:

  def destroy
    @item = Item.find(params[:id])
    @item.destroy

    respond_to do |format|
      format.html { redirect_to items_url }
      format.json { head :no_content }
    end
  end

当我执行item.destroy时,它会从我的数据库中删除该记录,但它不会从S3中删除该文件,也不会删除这些文件夹。

这是一个全新的S3存储桶,带有vanilla设置。也是一个全新的Carrierwave安装。

仅供参考:我已经尝试将@item.remove_item!@item.remove_image!添加到控制器的销毁操作中,但这也没有完成。

修改1

所以看起来发生的事情是它删除了一个附件。

该模型有:

class Item < ActiveRecord::Base
#  image       :string(255)
#  link        :string(255)
  mount_uploader :link, ItemUploader
  mount_uploader :image, ImageUploader
end

因此,当我在控制台中删除某个对象时,会删除与ItemUploader关联的对象,而不会删除与ImageUploader相关的图像。

为什么会删除1而不删除另一个?

3 个答案:

答案 0 :(得分:1)

我的控制台似乎有问题 - 因为一旦我通过网页UI删除了该对象,它就会删除S3中的所有相关对象。

但如果我通过控制台进行操作,则无效。

我将针对该特定问题打开另一个SO问题。

答案 1 :(得分:0)

如果您从cdn中引用文件(图像),它会删除但需要很少的时间。

答案 2 :(得分:-1)

使用aws sdk - https://github.com/amazonwebservices/aws-sdk-for-ruby

您可以构建一个外观来管理3上的对象,例如:

require 'aws-sdk'

class Facades::AmazonFacade
  attr_reader :s3

  #
  # Connection to Amazon S3
  #

  def initialize
     @s3 = AWS::S3.new(
       :access_key_id => config['access_key_id'],
       :secret_access_key => config['secret_access_key']
     )
     @bucket = @s3.buckets[self.config['bucket']]
  end

  def config
    @@config ||= YAML::load(File.open("#{Rails.root}/config/amazon_s3.yml" ))[Rails.env]
  end

  ####

  def policy(bucket, options = {})
   # Base 64 policy
  end

  def signature(bucket, options = {})
   # Base64 signature
  end



  #
  # Find object and get public urls
  #


  def url_link(obj, expires)
    @bucket.objects[obj].url_for(:read, :secure => true, :expires => 10*60).to_s
  end

  def object_exists_on_amazon?(obj)
    @bucket.objects[obj].exists?
  end

  def object_size(obj)
    unless Rails.env.test?
      @bucket.objects[obj].content_length
    end
  end

  def object_upload_date(obj)
    @bucket.objects[obj].last_modified
  end



  #
  # create, delete objects
  #


  def store_object_on_amazon(obj, file, access)
    @bucket.objects[obj].write(file, :acl => access)
  end

  def delete_object_on_amazon(obj)
    @bucket.objects[obj].delete(:force => true)
  end

end