Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 神龛宝石-如何防止从S3删除上传的文件_Ruby On Rails_Amazon Web Services_Amazon S3_Rubygems_Shrine - Fatal编程技术网

Ruby on rails 神龛宝石-如何防止从S3删除上传的文件

Ruby on rails 神龛宝石-如何防止从S3删除上传的文件,ruby-on-rails,amazon-web-services,amazon-s3,rubygems,shrine,Ruby On Rails,Amazon Web Services,Amazon S3,Rubygems,Shrine,我正在使用RubyonRails将图像存储在S3中 我怎样才能让神殿表现出如下的行为 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中上传图像,它们就永远不会被用户的操作删除 我发现类似

我正在使用RubyonRails将图像存储在S3中

我怎样才能让神殿表现出如下的行为

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将神龛放置到图像上传器

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


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

config/initializers/si祠.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
上,设置调整大小逻辑。在
Photo
model上,像
include ImageUploader::Attachment(:image)一样安装上传器

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

class光电控制器
有两种方法可以实现您的目标

方法1:在控制器上使用
delete
而不是
destroy
跳过触发Shieline回调的ActiveRecord回调

方法2:像这样


我找到了一个干净的方法

在您的sicle.rb初始值设定项中,只需创建一个自定义类:

class nodeletionshires3storage
您还可以使用keep_files Shieline插件:

Hello@batch,欢迎使用。请提供用于“上传文件,它们存储在S3中”和“从数据库中删除文件”的代码块。这样,我们实际上可以帮助您指出正确的方向。@ErvalhouS谢谢您的回复!我刚刚提供了代码块,所以如果您检查代码,我很高兴。@ErvalhouS谢谢您。第一种方法1非常有效!你救了我的命@批处理您是否找到了一个可以处理AR回调的解决方案,但不会删除S3上的文件?我想和你一样完成任务。
class PhotoController < ApiController

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

  render json: photo, serializer: PhotoSerializer
end
 Shrine.storages = { cache: ..., store: ..., backup: ... }

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