如何从s3中删除imagefile?

时间:2016-08-11 09:54:18

标签: ruby-on-rails ruby file-upload amazon-s3 carrierwave

我使用carrierwave和fog gems成功将图像文件上传到S3,但我不知道如何删除它。

我的意图如下。用户将图像文件上载到用户的“sumnail”属性。用户想要更改图像。系统将删除旧文件,然后上传新图像。我怎么能做到这一点?

我的上传者名字是Imgs。这是我的代码:

应用/上传/ imgs_uploader.rb

# encoding: utf-8

class ImgsUploader < CarrierWave::Uploader::Base

  # Choose what kind of storage to use for this uploader:
  # storage :file
  storage :fog

  def store_dir
    "uploads/"
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

  def filename
    Time.now.to_i.to_s + [*('a'..'z')].sample(8).join + "." + file.extension if original_filename
  end

end

应用/控制器/ home_controller.rb

 def sumnailUpload
    u = User.find(current_user.id)
    unless u.sumnail.empty?
      # I think remove old image code here.
    end

    file = params[:sumnail]
    uploader = ImgsUploader.new
    uploader.store!(file)      

    u.sumnail = uploader.url
    u.save    
    redirect_to "/home/index"
  end

配置/ initailzers / aws.rb

CarrierWave.configure do |config|
  #config.fog_provider = 'fog/aws'                        # required
  config.fog_credentials = {
    provider:              'AWS',                        
    aws_access_key_id:     ENV['ACCESS_KEY_ID'],                        
    aws_secret_access_key: ENV['SECRET_ACCESS_KEY'],                        
    region:                'ap-northeast-2',                  
    endpoint:              'https://s3.ap-northeast-2.amazonaws.com' 
  }
  config.fog_directory  = 'filefile'                          
  config.fog_public     = true                         
  config.fog_attributes = {} 
end

=============================================== ==================

17.2.6我这样解决了

应用/模型/ user.rb     需要'carrierwave / orm / activerecord'     class User&lt;的ActiveRecord :: Base的       mount_uploader:avatar,AvatarUploader       ...     端

应用/上传/ imgs_uploader.rb     class ImgsUploader&lt; CarrierWave ::上传::基

  storage :fog
  ...
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  ...
  def filename
    # "something.jpg" if original_filename
    "u_#{model.id}." + file.extension if original_filename
  end

end

然后,我就这样使用了。

one_user.avatar.store!( “”)

2 个答案:

答案 0 :(得分:0)

您可以使用AWS控制台或使用AWS CLI删除图像文件

S3 CLI

S3 API

答案 1 :(得分:0)

您应该能够在用户实例上调用User#remove_sumnail!,然后保存。

user = User.find(params[:id])
user.remove_sumnail!
user.save

请参阅此处的文档:

https://github.com/carrierwaveuploader/carrierwave/blob/17ae595237339ea9372aa4b9144387c5041b32f0/lib/carrierwave/mount.rb#L87

在这里:

https://github.com/carrierwaveuploader/carrierwave#removing-uploaded-files