ruby-on-rails - Shrine gem - 如何防止从 S3 删除上传的文件

标签 ruby-on-rails amazon-web-services amazon-s3 rubygems shrine

我正在使用 shrine用于通过 Ruby on Rails 在 S3 中存储图像的 gem。

我怎样才能让 shrine 表现如下?

1. When uploading files from Frontend, they are stored in S3.
2. When deleting files from Frontend, they are deleted from Database, "but not deleted from S3"

也就是说,一旦我在 S3 中上传图片,它们就不会被用户的操作删除。

我找到了类似的 question , 但我想实现的是完全相反的情况。


现在的情况是这样的。

我按照 shrine S3 docs 把 shrine 给 ImageUploader .

上传文件时,它们存储在S3中。 当我尝试从数据库中删除文件时,它们也会从 S3 中删除。


这是将文件上传到 S3 并从 S3 中删除的代码块。

config/initializers/shrine.rb

require "shrine"
require "shrine/storage/file_system"
require "shrine/storage/s3"


s3_options = {
    access_key_id: ENV[ACCESS_KEY_ID],
    secret_access_key: ENV[SECRET_ACCESS_KEY],
    region: ENV[REGION],
    bucket: ENV[BUCKET],
}

Shrine.storages = {
    cache: Shrine::Storage::S3.new(prefix: ..., **s3_options),
    store: Shrine::Storage::S3.new(prefix: ..., **s3_options),
}


Shrine.plugin :activerecord           
Shrine.plugin :cached_attachment_data 
Shrine.plugin :restore_cached_data 

Shrine.plugin :url_options,
              cache: { public: true, host: ENV[CLOUDFRONT_URL] },
              store: { public: true, host: ENV[CLOUDFRONT_URL] }

关于 ImageUploader < Shrine , 设置调整大小逻辑。在 Photo 上型号,像include ImageUploader::Attachment(:image)一样安装 uploader

从数据库中删除文件时,我是这样使用ActiveRecord的。(在这一点上,它们也从S3中删除)

class PhotoController < ApiController

def destroy
  photo = Photo.find(params[:id])
  photo.destroy!

  render json: photo, serializer: PhotoSerializer
end

最佳答案

有两种方法可以实现您想要的效果。

方法 1:通过在 Controller 上使用 delete 而不是 destroy 来跳过触发 Shrine 回调的 ActiveRecord 回调。

方法二:Add mirroring and backup to your Shrine configuration像这样

 Shrine.storages = { cache: ..., store: ..., backup: ... }

 Shrine.plugin :mirroring, mirror: { store: :backup }

关于ruby-on-rails - Shrine gem - 如何防止从 S3 删除上传的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63582360/

相关文章:

ruby-on-rails - Rails 中的操作和过滤器之间的区别

ruby-on-rails - Apache设置多个站点

java - AWS S3 上的托管文件可以从特定网站下载,但不能从其他地方下载

amazon-web-services - S3 同步与跨区域复制

php - S3 上传后如何返回 Cloudfront url?

ruby-on-rails - 如何在 Rails 代码中链接社交媒体图片

javascript - Ember-Rails "Cannot read property ' extend' of undefined"

amazon-web-services - AWS ECS 是否支持每个容器的动态可扩展性?

amazon-web-services - 使用 SAM 模板在 AWS 代理 API 网关中列入 IP 白名单

wordpress - 如何使用适用于 WordPress 的 lightsail 设置 AWS cloudfront?