Shrine gem - 如何防止从 S3 删除上传的文件
Shrine gem - how to prevent deletion of uploaded files from S3
我正在使用 shrine gem 通过 Ruby 在 Rails 上将图像存储在 S3 中。
如何让 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中上传图片,它们就不会被用户删除。
我发现了类似的,但我想实现的是完全相反的情况。
现在的情况是这样的
我按照神社S3给ImageUploader堆了个神社docs。
上传文件时,它们存储在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)
一样安装上传器
从数据库中删除文件时,我是这样使用ActiveRecord的。(在这一点上,它们也从S3中删除)
class PhotoController < ApiController
def destroy
photo = Photo.find(params[:id])
photo.destroy!
render json: photo, serializer: PhotoSerializer
end
有两种方法可以达到你想要的效果。
方法 1:通过在您的控制器上使用 delete
而不是 destroy
来跳过触发 Shrine 回调的 ActiveRecord 回调。
方法二:Add mirroring and backup to your Shrine configuration像这样
Shrine.storages = { cache: ..., store: ..., backup: ... }
Shrine.plugin :mirroring, mirror: { store: :backup }
我找到了一个干净整洁的方法...
在您的 shrine.rb 初始化程序中,只需创建一个自定义 class:
class NoDeletionShrineS3Storage < Shrine::Storage::S3
def delete(id)
true
end
def delete_prefixed(delete_prefix)
true
end
def clear!(&block)
true
end
end
Shrine.storages = {
cache: Shrine::Storage::FileSystem.new..), # temporary
store: NoDeletionShrineS3Storage.new(
bucket: "mybucket", # required
region: "eu-central-1", # required
access_key_id: '123..',
secret_access_key: '123..',
)
}
您还可以使用 keep_files Shrine 插件:https://shrinerb.com/docs/plugins/keep_files
我正在使用 shrine gem 通过 Ruby 在 Rails 上将图像存储在 S3 中。
如何让 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中上传图片,它们就不会被用户删除。
我发现了类似的
现在的情况是这样的
我按照神社S3给ImageUploader堆了个神社docs。
上传文件时,它们存储在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)
从数据库中删除文件时,我是这样使用ActiveRecord的。(在这一点上,它们也从S3中删除)
class PhotoController < ApiController
def destroy
photo = Photo.find(params[:id])
photo.destroy!
render json: photo, serializer: PhotoSerializer
end
有两种方法可以达到你想要的效果。
方法 1:通过在您的控制器上使用 delete
而不是 destroy
来跳过触发 Shrine 回调的 ActiveRecord 回调。
方法二:Add mirroring and backup to your Shrine configuration像这样
Shrine.storages = { cache: ..., store: ..., backup: ... }
Shrine.plugin :mirroring, mirror: { store: :backup }
我找到了一个干净整洁的方法...
在您的 shrine.rb 初始化程序中,只需创建一个自定义 class:
class NoDeletionShrineS3Storage < Shrine::Storage::S3
def delete(id)
true
end
def delete_prefixed(delete_prefix)
true
end
def clear!(&block)
true
end
end
Shrine.storages = {
cache: Shrine::Storage::FileSystem.new..), # temporary
store: NoDeletionShrineS3Storage.new(
bucket: "mybucket", # required
region: "eu-central-1", # required
access_key_id: '123..',
secret_access_key: '123..',
)
}
您还可以使用 keep_files Shrine 插件:https://shrinerb.com/docs/plugins/keep_files