Я использую камни carrierwave
и carrierwave-aws
для загрузки на S3 из приложения Rails. Я могу загружать файлы без каких-либо проблем, но я не могу удалить их из S3.Файлы Carrierwave не удаляются с S3
Моя модель ActiveRecord называется Episode, и ее свойство видео установлено моим загрузчиком CarrierWave::Uploader::Base
(который включает в себя CarrierWave::Video
).
Вот шаги, я затем:
- Создать эпизод
- Загрузить видео, убедитесь, что он существует на S3 (! Это работает)
- Вызов
episode.remove_video!; episode.save!
из консоли - На этом этапе видео все еще существует на 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
, если это имеет значение здесь.
Это сработало! Спасибо огромное! –