2015-08-30 3 views
2

Я использую камни carrierwave и carrierwave-aws для загрузки на S3 из приложения Rails. Я могу загружать файлы без каких-либо проблем, но я не могу удалить их из S3.Файлы Carrierwave не удаляются с S3

Моя модель ActiveRecord называется Episode, и ее свойство видео установлено моим загрузчиком CarrierWave::Uploader::Base (который включает в себя CarrierWave::Video).

Вот шаги, я затем:

  1. Создать эпизод
  2. Загрузить видео, убедитесь, что он существует на S3 (! Это работает)
  3. Вызов episode.remove_video!; episode.save! из консоли
  4. На этом этапе видео все еще существует на S3, несмотря на отсутствие сообщения об ошибке

Я также пробовал:

episode.video.remove! 
episode.save! 

Который производит этот выход, но не удаляет файл из S3:

[180] pry(main)> episode.video.remove! 
=> [:remove_versions!] 

Я также попытался:

episode.destroy!

, который должен вызывать обратный вызов ActiveRecord added by Carrierwave, но нет. Я добавил свой собственный метод before_destroy (destroy_assets ниже), но это также не работает.

Вот мои настройки:

carrierwave.rb

CarrierWave.configure do |config| 
    config.storage = :aws 
    config.aws_bucket = 'BUCKET_NAME' 
    config.aws_acl = 'public-read' 

    config.aws_authenticated_url_expiration = 60 * 60 * 24 * 7 

    config.aws_attributes = { 
    expires: 2.week.from_now.httpdate, 
    cache_control: 'max-age=604800' 
    } 

    config.aws_credentials = { 
    access_key_id:  ENV['aws_access_key'], 
    secret_access_key: ENV['aws_secret'], 
    region:   'us-east-1' 
    } 

    config.remove_previously_stored_files_after_update = true 

end 

video_uploader.rb

class VideoUploader < CarrierWave::Uploader::Base 
    include CarrierWave::Video 
    storage :was 

    def store_dir 
    "uploads/videos/#{model.id}" 
    end 

end 

episode.rb

class Episode < ActiveRecord::Base 
    mount_uploader :video, VideoUploader 
    before_destroy :destroy_assets 

    def destroy_assets 
    self.video.remove! if self.video 
    self.save! 
    end 

end 

Полномочия AWS Я использую предназначены для использования IAM r с политикой AmazonS3FullAccess, если это имеет значение здесь.

ответ

1

Я бы обновить store_dir быть:

"uploads/videos/#{mounted_as}/#{model.id}" 

Так что carrierwave, а используя систему крепления, удаляет файл, он знает, где найти его, когда он называет метод полного имени внутренне!

+1

Это сработало! Спасибо огромное! –