gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:30:27 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com