2

我有 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 存储桶,具有普通设置。还有一个全新的 Carrierwave 安装。

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

编辑 1

所以似乎发生的事情是它删除了 1 个附件。

该模型有这个:

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

因此,当我在控制台中删除对象时,它会删除与关联的对象,ItemUploader而不是通过ImageUploader.

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

4

3 回答 3

1

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

但是,如果我通过控制台执行此操作,则它不起作用。

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

于 2013-05-05T21:33:42.173 回答
0

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

于 2016-10-27T09:28:27.873 回答
-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
于 2013-05-05T15:33:48.357 回答