【问题标题】:Carrierwave doesn't remove the deleted files from S3Carrierwave 不会从 S3 中删除已删除的文件
【发布时间】:2013-04-29 03:19:50
【问题描述】:

我有 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 而不是另一个?

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    但如果我通过控制台进行操作,它就不起作用了。

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

    【讨论】:

      【解决方案3】:

      使用 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
      

      【讨论】:

      • 我不想经历这一切。我相信 Carrierwave 应该从 S3 中删除对象。只是不知道为什么它现在行为不端。
      猜你喜欢
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 2020-04-24
      • 2012-07-09
      • 2018-01-18
      • 1970-01-01
      相关资源
      最近更新 更多